Dijkstra算法+01背包问题
# include <stdio.h>
# define MAX(a,b) (a)>(b)?(a):(b)
# define MIN(a,b) (a)<(b)?(a):(b)
# define N 102
# define S 1000001
void DJSTL();
char Flag[N];
int MAP[N][N],NUM[N],DP[S],s,n,m;
int main(){
int i,j,x,A,B,C;
//freopen("ABC.txt","r",stdin);
scanf("%d",&x);
while(x--){
scanf("%d%d%d",&s,&n,&m);
for(i=0,n++;i<n;i++) //初始化标志和图
{
Flag[i]=0;
for(j=0;j<n;j++)
MAP[i][j]=S;
}
while(m--){
scanf("%d%d%d",&A,&B,&C);//输入节点信息
MAP[B][A]=MAP[A][B]=MIN(MAP[A][B],C);
}
for(i=1;i<n;i++)
scanf("%d",&NUM[i]);
DJSTL();
for(i=1;i<n;i++)
for(j=s;j>=MAP[0][i];j--)
DP[j]=MAX(DP[j],DP[j-MAP[0][i]]+NUM[i]);
printf("%d\n",DP[s]);
while(s)DP[s--]=0;
}
return 0;
}
void DJSTL()
{
int i,j,k,L;
for(i=1;i<n;i++)
{
L=S;
for(j=1;j<n;j++)
{
if(Flag[j])continue;
if(L>MAP[0][j])
{
L=MAP[0][j];
k=j;
}
}
Flag[k]=1;
for(j=1;j<n;j++)
{
if(Flag[j])continue;
MAP[0][j]=MIN(MAP[0][j],L+MAP[k][j]);
}
}
}
运行结果: