题解 P1807 【最长路_NOI导刊2010提高(07)】
Altria_Pendragon_ · · 题解
emmmm……
楼下怎么都是SPFA呢orz
那本人水一发Bellman-Ford吧……
思路楼下讲的很清楚:
-
把最长边转换为最短边(也就是取负值啦)
-
跑一遍最短路模板(点点有惊喜)
-
最后的答案在取负回来
注意到达不了的情况(可以跑一遍遍历,但本人很懒就随便过了……)
下面放上丑陋美丽的ACcode:
#include<bits/stdc++.h>
using namespace std;
int main(){
int dis[50001],w[50001],n,m,minn,f[50001][3];
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
dis[i]=w[i]=100000000;
f[i][1]=f[i][2]=0;
}
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
f[i][1]=a,f[i][2]=b,w[i]=-c;
}
dis[1]=0;
for(int i=1;i<=n-1;i++){
for(int j=1;j<=m;j++){
dis[f[j][2]]=min(dis[f[j][2]],dis[f[j][1]]+w[j]);
}
}
if(dis[n]!=0)
printf("%d",-dis[n]);
else printf("-1");
return 0;
}
ps:Bellman-Ford算法不用判断重边,最短路该怎么求就怎么求
pps:拒绝抄袭,营造良好洛谷
ppps:如果代码有错误请回复,感激不尽~~~~
pppps:觉得有帮助就点个赞呗~~~~