hdu 4284 floyd+暴搜

来源:互联网 发布:t型截面惯性矩的算法 编辑:程序博客网 时间:2024/06/08 16:46

注意到H (H <= 15)   所以 可以 选择 状压+dp

但是 直接用搜索也可以过。经典的TSP问题。

#include<cstdio>#include<cstring>#include<iostream>using namespace std;int Map[150][150];const int INF=1<<29;struct node{    int v;    int get,pay;}s[20];int n,m,money;int vis[150];int h;void floyd(){    int i,j,k;    for(k=1;k<=n;k++)        for(i=1;i<=n;i++)            for(j=1;j<=n;j++){                if(i==j||i==k||j==k) continue;                    Map[i][j]=min(Map[i][j],Map[i][k]+Map[k][j]);            }}int dfs(int u,int leave,int number){    int i;    if(number==h){        if(leave>=Map[u][1]) return 1;        return 0;    }    for(i=0;i<h;i++){        if(vis[s[i].v]==0){            if(Map[u][s[i].v]<INF&&leave>=Map[u][s[i].v]+s[i].pay){                vis[s[i].v]=1;                if(dfs(s[i].v,leave-Map[u][s[i].v]-s[i].pay+s[i].get,number+1)) return 1;                vis[s[i].v]=0;            }        }    }    return 0;}int main(){    int t,i,j;    scanf("%d",&t);    while(t--){        memset(vis,0,sizeof(vis));        scanf("%d%d%d",&n,&m,&money);        //memset(Map,0,sizeof(Map));        for(i=1;i<=n;i++){            for(j=1;j<=n;j++)                Map[i][j]=INF;            Map[i][i]=0;        }        for(i=0;i<m;i++) {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            Map[b][a]=min(Map[b][a],c);            Map[a][b]=Map[b][a];        }        scanf("%d",&h);        int total=0;        for(i=0;i<h;i++){            scanf("%d%d%d",&s[i].v,&s[i].get,&s[i].pay);        }        floyd();        if(dfs(1,money,total)) printf("YES\n");        else printf("NO\n");    }}


0 0
原创粉丝点击