作业一 三国志

来源:互联网 发布:mac版teamviewer 编辑:程序博客网 时间:2024/04/27 14:30

0-1背包

#include<stdio.h>  

#include<string.h>  
#include<algorithm>  
#define INF 0x3f3f3f3f  
#define N 110  
using namespace std;  
int map[N][N];  
int vis[N];  
int dis[N];  
int d[N];  
int dp[N*10000];  
int z,n,m;  
int dijst()  
{  
    int min,i,j,k,sum;  
    memset(vis,0,sizeof(vis));  
    for(i=0;i<=n;i++)  
        dis[i]=map[0][i];  
    vis[0]=1;  
    for(j=1;j<=n;j++)  
    {  
        min=INF;  
        k=0;  
        for(i=0;i<=n;i++)  
        {  
            if(!vis[i]&&dis[i]<min)  
            {  
                k=i;  
                min=dis[i];  
            }  
        }  
        vis[k]=1;  
        for(i=0;i<=n;i++)  
        {  
            if(!vis[i]&&dis[k]+map[k][i]<dis[i])  
                dis[i]=dis[k]+map[k][i];  
        }  
    }  
}  
int main()  
{  
    int t,a,b,c,i,j;  
    scanf("%d",&t);  
    while(t--)  
    {  
        memset(map,INF,sizeof(map));   
        scanf("%d%d%d",&z,&n,&m);  
        while(m--)  
        {  
            scanf("%d%d%d",&a,&b,&c);  
            if(c<map[a][b])  
                map[a][b]=map[b][a]=c;  
        }  
        for(i=1;i<=n;i++)  
            scanf("%d",&d[i]);    
        dijst();  
        memset(dp,0,sizeof(dp));  
        for(i=1;i<=n;i++)  
        {  
            for(j=z;j>=dis[i];j--)  
            {  
                dp[j]=max(dp[j],dp[j-dis[i]]+d[i]);  
            }  
        }  
        printf("%d\n",dp[z]);  
    }  
    return 0;  

}