hdu 1224 最长路+dp

来源:互联网 发布:小金龙软件 编辑:程序博客网 时间:2024/06/05 18:06

题目链接


题意:有n个城市,每个城市都有一个有趣值,现在告诉你每个城市的有趣值,以及哪些城市之间可以到达,起点是1号城市,终点是n+1号城市,问路过城市的有趣值最大是多少,并输出此路线


思路:就是把最短路改成最长路,再倒着推回来就可以得到路线。具体看代码好了。


#include<cstdio>#include<cstring>#include<iostream>#include<vector>#include<queue>using namespace std;int dis[110];int ma[110][100];int n,m;int ans[110];int point[110];bool inqueue[110];vector<int>p[110];queue<int>s;void spfa(){    memset(inqueue,0,sizeof(0));    inqueue[1]=1;    dis[1]=0;    s.push(1);    while(!s.empty()){        int c=s.front();        inqueue[c]=0;        s.pop();        for(int j=0;j<p[c].size();j++){            int i=p[c][j];            if(dis[c]+ma[c][i]>dis[i]){                dis[i]=ma[c][i]+dis[c];                if(!inqueue[i]){                    s.push(i);                    inqueue[i]=1;                }            }        }    }}int main(){    int cas;    cin>>cas;    for(int ca=1;ca<=cas;ca++){            memset(ma,0,sizeof(ma));            memset(dis,0,sizeof(dis));            for(int i=0;i<110;i++) p[i].clear();            cin>>n;            for(int i=1;i<=n;i++)                scanf("%d",&point[i]);            point[n+1]=1;            cin>>m;            int a,b;            while(m--){                scanf("%d %d",&a,&b);                ma[a][b]=point[b];                p[a].push_back(b);            }            spfa();            int i=0,cur=n+1;            while(cur!=1){                for(int j=1;j<=n+1;j++){                    if(ma[j][cur]&&dis[j]+ma[j][cur]==dis[cur]){                        cur=j;                        ans[i++]=j;                    }                }            }            printf("CASE %d#\n",ca);            printf("points : %d\n",dis[n+1]-1);            printf("circuit : ");            for(int j=i-1;j>=0;j--){                cout<<ans[j]<<"->";            }            cout<<1<<endl;            if(ca!=cas)                cout<<endl;    }    return 0;}


0 0
原创粉丝点击