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; }
相关文章推荐
- Layout Poj 3169 差分约束与SPFA
- POJ 3169 Layout(差分约束 spfa)
- Layout POJ - 3169 差分约束 SPFA
- POJ 3169 SPFA 差分约束 最大值->最短路径求法
- POJ 3169 Layout (差分约束spfa)
- POJ 3169(差分约束 + spfa模板)
- poj 3169 spfa 差分约束
- [POJ 3169]Layout[差分约束][最短路]
- POJ1201 HDU1384 Intervals【SPFA】【差分约束】
- poj 3169 差分约束(奶牛排队)
- POJ ~ 3169 ~ Layout (SPFA + 差分约束)
- poj 3169 Layout(差分约束)
- 差分约束Poj 3169 Layout
- 关于差分约束的一些总结和题解。(poj 1364 ,3159, 2983, 3169 ,1201 ,1716 ,1275)
- POJ 题目3169 Layout(差分约束)
- POJ 1275 Cashier Employment (差分约束 + spfa)
- poj 3159 Candies 【简单差分约束】 【SPFA + 数组模拟栈】
- Layout POJ - 3169(差分约束) 题解
- poj 3169 Layout (差分约束)
- poj 3169 Layout(差分约束)