本题让我学会了bellmanford求最短路最长路。spfa优化,查分约束系统。
这个题目有一个要注意的点是注意更新操作。,有点动态规划的影子。
#include<iostream>
#include<string>
#define inf 100000000
using namespace std;
struct E
{
int s,t,w;
}edge[100002];
int n,m;
void bellman_ford()
{
int i,j;
bool flag;
int d[100002];
//for(i=0;i<n;++i)
// d[i]=inf;
//d[0]=0;
memset(d,0,sizeof(d));
for(i=0;i<=m;++i)
{
flag=false;
for(j=0;j<n;++j)
{
//if(d[edge[j].s]!=inf)
//{
if(d[edge[j].s]+edge[j].w<d[edge[j].t])
{
d[edge[j].t]=d[edge[j].s]+edge[j].w;
flag=true;
}
//}
}
for(j=1;j<=m;j++)
{
if(d[j-1]+1<d[j])
{
d[j]=d[j-1]+1;
flag=true;
}
}
for(j=m;j>=1;j--)
{
if(d[j]<d[j-1])
{
d[j-1]=d[j];
flag=true;
}
}
if(!flag)
break;
}
/*for(i=0;i<m;++i)
{
if(d[edge[i].t]>d[edge[i].s]+edge[i].w)
return false;
}*/
printf("%d/n",d[m]-d[0]);
return ;
}
int main()
{
int t;
while(scanf("%d",&t)==1)
{
int i;
n=0;
m=-1;
for(i=0;i<t;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
edge[n].s=b;
edge[n].t=a-1;
edge[n++].w=-c;
if(b>m)
m=b;
}
bellman_ford();
}
return 0;
}