赚钱啦(单源最短路径(含有负权)Bellman_Forld()算法)

来源:互联网 发布:谷歌输入法 mac 编辑:程序博客网 时间:2024/06/05 03:04

题目连接:http://59.69.128.200/JudgeOnline/problem.php?pid=183

题意:一个商人在从一个城市到另一个城市之间要花一定的费用,同时也能赚钱(赚的可能比花的多),问他从第一个城市到最后一个城市间最多能赚多少钱,如果不赚钱的花输出最少亏损多少。如何能无限赚钱的花输入“¥¥¥”;

解题思路:此题是最短路的变形。首先会想到Dijkstra()来求最短路,由于会出现负权(会出现环),因此得用Bellman_Forld(),如果出现环即跳出循环;

Dijkstra()在求单源最短路径是图中不能出现负权。而Bellma_Forld能处理含有负权的图

 #include<iostream>#include<algorithm>#include<cstring>using namespace std;struct A{int a,b,c;}ch[10010];void Bellman_Forld(int m,int k){int s[1003];int flat=0;for(int i=0;i<m;i++){s[i]=1000000;}s[0]=0;for(int i=0;i<=m;i++){flat=0;for(int j=0;j<k;j++){if(s[ch[j].b]>s[ch[j].a]+ch[j].c){s[ch[j].b]=s[ch[j].a]+ch[j].c;flat=1;}}if(!flat)break;}if(flat)cout<<"${1}quot;<<endl;else cout<<-s[m-1]<<endl;}int main(){int N;cin>>N;while(N--){int m,n;cin>>m>>n;int k=0;for(int i=0;i<n;i++){int x,y,c,u,v;cin>>x>>y>>c>>u>>v;ch[k].a=x;ch[k].b=y;ch[k].c=c-u;k++;ch[k].a=y;ch[k].b=x;ch[k].c=c-v;k++;}Bellman_Forld(m,k);}}