您的位置:首页 > 其它

poj 3169 差分约束 + spfa

2011-09-14 15:00 351 查看
#include<iostream>
#include<queue>
using namespace std;
#define inf 0x1fffffff
int dist[10010],visited[10010],adj[10010],size,cnt[10010];
int nodenum,edgenum1,edgenum2;
struct node
{
int e,v,next;
}head[100100];
void add(int s,int e,int v)
{
head[size].e = e;
head[size].v = v;
head[size].next = adj[s];
adj[s] = size++;
}
int spfa()
{
int i;
for(i = 0;i <= nodenum;i++)
dist[i] = inf;
dist[1] = 0;
queue<int> que;
que.push(1);
visited[1] = 1;
int s,e,v;
while(!que.empty())
{
s = que.front();
que.pop();
visited[s] = 0;
for(i = adj[s];i != -1;i = head[i].next)
{
e = head[i].e;
v = head[i].v;
if(dist[e] > dist[s] + v)
{
dist[e] = dist[s] + v;
if(!visited[e])
{
visited[e] = 1;
cnt[e]++;
if(cnt[e] >= nodenum) //cnt[e] > nodenum
return 0;
}
que.push(e);
}
}
}
return 1;
}
int main()
{
scanf("%d%d%d",&nodenum,&edgenum1,&edgenum2);
int i,a,b,c;
size = 0;
memset(adj,-1,sizeof(adj));
for(i = 0;i < edgenum1;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
for(i = 0;i < edgenum2;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(b,a,-c);
}
for(i = 1;i < nodenum;i++) //for(i = 2;i <= nodenum;i++)
add(i+1,i,0);          //add(i,1,0);
int t = spfa();
if(!t)
printf("-1\n"); //有负权回路
else
{
if(dist[nodenum] == inf)
printf("-2\n"); //不连通
else
printf("%d\n",dist[nodenum]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct c