题目连接: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);
}
}