题目大意
找到有向边权图的一个最小负环,输出点的个数。
瞎做
设f[i,j,k]表示i到j经过k个点的最短路。
#include<cstdio>
#include<algorithm>
#define min(a,b) (a<b?a:b)
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=300+10,maxm=90000+10,inf=1000000000;
int f[maxn][maxn],g[maxn][maxn];
int h[maxn],from[maxm],go[maxm],dis[maxm],next[maxm];
int i,j,k,l,t,n,m,tot,ans;
void add(int x,int y,int z){
go[++tot]=y;
from[tot]=x;
dis[tot]=z;
next[tot]=h[x];
h[x]=tot;
}
int main(){
//freopen("data.in","r",stdin);
scanf("%d%d",&n,&m);
fo(i,1,m){
scanf("%d%d%d",&j,&k,&l);
add(j,k,l);
}
fo(i,1,n)
fo(j,1,n)
f[i][j]=inf;
fo(i,1,n) f[i][i]=0;
fo(k,1,n){
fo(i,1,n)
fo(j,1,n)
g[i][j]=f[i][j];
fo(i,1,n){
fo(j,1,n){
t=h[j];
while (t){
l=go[t];
g[i][l]=min(g[i][l],f[i][j]+dis[t]);
t=next[t];
}
}
}
fo(i,1,n)
fo(j,1,n)
f[i][j]=g[i][j];
fo(i,1,n)
if (f[i][i]<0){
printf("%d\n",k);
return 0;
}
}
printf("0\n");
}