三国志

来源:互联网 发布:淘宝1.9元包邮怎么赚钱 编辑:程序博客网 时间:2024/04/27 14:08

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]); 
        }    
    } 
}

运行结果:

原创粉丝点击