您的位置:首页 > 其它

poj-1125-Stockbroker Grapevine spfa模板

2016-01-10 22:07 393 查看
本模板无判断负环部分,

判断负环方法记录每个点压队列次数 若有一大于V则存在负环

#include<cstdio>
#include<queue>
#include<algorithm>
#include<iostream>
#include<cstring>
#define maxx 999999999
using 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: