赚钱啦
实战连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=183
#include"stdio.h"
#define max 1000000
int dist[1010];
struct edge
{
int a,b,earn;
}city[2010];
void init(int n)
{
int i;
for(i=1;i<n;i++)
dist[i]=max;
dist[0]=0;
return ;
}
void Bellman_ford(int n,int top )
{
int flat,i,j;
//先进行一次松弛操作
for(i=0;i<n-1;i++)
for(j=0;j<top;j++)
{
if(dist[city[j].b]>dist[city[j].a]+city[j].earn) //最大的费用
dist[city[j].b]=dist[city[j].a]+city[j].earn;
}
flat=0;
//因为上面已经进行了一次松弛操作,如果没有负的存在的话,那么会有dist[city[i].b]<=dist[city[i].a]+city[i].earn
for(i=0;i<top;i++)
if(dist[city[i].b]>dist[city[i].a]+city[i].earn)
{
flat=1;
break;
}
if(!flat)
printf("%d\n",-dist[n-1]);
else
printf("$$$\n");
}
int main()
{
int t,e,n,a_num,b_num,c,u,v,i,top;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&e);
init(n);
top=0;
for(i=0;i<e;i++)
{
scanf("%d%d%d%d%d",&a_num,&b_num,&c,&u,&v);
if(!a_num) dist[b_num]=c-u;
if(!b_num) dist[a_num]=c-v;
city[top].a=a_num;city[top].b=b_num;city[top++].earn=c-u;//转化为负的
city[top].a=b_num;city[top].b=a_num;city[top++].earn=c-v;
}
Bellman_ford(n,top);
}
return 0;
}