HDU 1224——Free DIY Tour

来源:互联网 发布:bing桌面壁纸软件 编辑:程序博客网 时间:2024/05/05 07:03

 弗洛伊德算法

题意为从城市1到城市n+1,求经过的城市的有趣值之和最高的路线。

并且旅游路线只能是序号小的城市到序号大的城市。

#include<iostream>#include<cstdio>using namespace std;#define maxn 105#define INF -100001int map[maxn][maxn],path[maxn][maxn],val[maxn];//path代表从i到j这条路线中,i之后的节点。int main(){int i,j,k;int t,n,m,s,e;int num=1;cin>>t;while(t--){if(num!=1)cout<<endl;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&val[i]);n++;for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i!=j)map[i][j]=INF;elsemap[i][j]=0;path[i][j]=j;}cin>>m;for(i=1;i<=m;i++){scanf("%d%d",&s,&e);map[s][e]=val[e];}for(i=1;i<=n;i++)//弗洛伊德算法for(j=1;j<=n;j++)for(k=1;k<=n;k++)if(map[j][i]!=INF&&map[i][k]!=INF)if(map[j][k]<map[j][i]+map[i][k]){map[j][k]=map[j][i]+map[i][k];path[j][k]=path[j][i];}cout<<"CASE "<<num<<"#\n";num++;cout<<"points : "<<map[1][n]<<"\n";cout<<"circuit : ";k=1;while(k!=n){printf("%d->",k);k=path[k][n];}printf("1\n");}return 0;}