SPFA:
int first[maxn],inq[maxn],viscnt[maxn],dis[maxn];
int nex[maxm],v[maxm];
int ecnt,n,m;
void add_(int a,int b,int c)
{
w[ecnt]=c;
v[ecnt]=b;
nex[ecnt]=first[a];
first[a]=ecnt++;
}
void init()
{
memset(first,-1,sizeof first);
ecnt=0;
}
void spfa(int x)
{
queue<int>q;
memset(dis,0x3f,sizeof dis);
memset(inq,0,sizeof inq);
memset(viscnt,0,sizeof viscnt);
q.push(x);
dis[x]=0;
inq[x]=1;
viscnt[x]=1;
while(!q.empty())
{
int e,x=q.front();q.pop();
inq[x]=0;
for(e=first[x];e!=-1;e=next[e])
if(dis[x]+w[e]<dis[v[e]])
{
dis[v[e]]=dis[x]+w[e];
if(!inq[v[e]])
{
q.push(v[e]);
inq[v[e]]=1;
if((++viscnt[v[e]]==n))return 1;
}
}
}
return 0;
}