题意:有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;
}