poj-1125-Stockbroker Grapevine spfa模板

来源:互联网 发布:python 提取文件名 编辑:程序博客网 时间:2024/06/07 21:48

本模板无判断负环部分,
判断负环方法记录每个点压队列次数 若有一大于V则存在负环

#include<cstdio>#include<queue>#include<algorithm>#include<iostream>#include<cstring>#define maxx 999999999using namespace std;struct edge{  int x,y,dis,next;}e[11000];int head[11000],n,m,l1,dequeue[1000],v[1000];void init(){   for(int i=1;i<=n;i++)    head[i] = -1;}void add(int pre,int to,int dis){   e[l1].x = pre;   e[l1].y = to;   e[l1].dis= dis;   e[l1].next = head[pre];   head[pre] = l1;   l1++;}int spfa(int star){    memset(dequeue,0,sizeof(dequeue));    for(int i=1;i<=n;i++)        v[i] = maxx;    v[star]  =0;    queue<int>qu;    qu.push(star);    dequeue[star] = 1;    while(!qu.empty())    {       int qu1 = qu.front();       qu.pop();       for(int i = head[qu1];i!=-1;i = e[i].next){           if(v[e[i].y]>v[e[i].x]+e[i].dis){               v[e[i].y] = v[e[i].x]+e[i].dis;               if(!dequeue[e[i].y]){                     qu.push(e[i].y);                     dequeue[e[i].y] = 1;               }           }       }         dequeue[qu1] = 0;    }    int ss =-1;    for(int i=1;i<=n;i++)        if(v[i]>ss)ss = v[i];    return ss;}int main(){    while(scanf("%d",&n)&&n)    {       init();       l1 = 0;       for(int i=1;i<=n;i++)       {           int m;           scanf("%d",&m);           while(m--){              int a,b;              scanf("%d%d",&a,&b);              add(i,a,b);           }       }        int minn = maxx,minnx;       for(int i=1;i<=n;i++)       {          int s = spfa(i);          if(s<minn){minn = s;minnx = i;}       }       if(minn == maxx)printf("disjoint\n");       else printf("%d %d\n",minnx,minn);    }    return 0;}
0 0