弗洛伊德算法
题意为从城市1到城市n+1,求经过的城市的有趣值之和最高的路线。
并且旅游路线只能是序号小的城市到序号大的城市。
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 105
#define INF -100001
int 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;
else
map[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;
}