QAQ
因为要求最小值,所以要跑最长路。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int head[999999],net[999999],to[9999999],cost[999999];
int cnt;
int dis[999999];
int f[999999];
int d[999999];
int vis[999999];
void add(int x,int y,int z)
{
to[++cnt]=y;
cost[cnt]=z;
net[cnt]=head[x];
head[x]=cnt;
}
int abs(int x)
{
if(x<0) return -x;
return x;
}
void spfa(int n)
{
memset(dis,128,sizeof(dis));
d[0]=0;
f[0]=1;
dis[0]=0;
int h=0;
int t=1;
int tot=0;
do
{
int dd=d[++h];
f[dd]=0;
if(vis[dd]>n)
{
printf("NO");
return;
}
for(int i=head[dd];i;i=net[i])
{
int p=to[i];
if(dis[p]<dis[dd]+cost[i])
{
dis[p]=dis[dd]+cost[i];
if(!f[p])
{
vis[p]++;
d[++t]=p;
f[p]=1;
}
}
}
}while(h<t);
int k=-99999999;
for(int i=1;i<=n;i++)
k=max(abs(dis[i]),k);
if(k>=0)
printf("%d\n",k);
else
printf("%d\n",-k);
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
add(0,i,0);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(z==0)
{
add(x,y,z);
add(y,x,z);
}
if(z==1)
{
add(y,x,1);
}
if(z==-1)
{
add(x,y,1);
}
}
spfa(n);
return 0;
}