poj 3169 差分约束 + spfa

来源:互联网 发布:美国网络小说 知乎 编辑:程序博客网 时间:2024/04/19 07:57
#include<iostream>#include<queue>using namespace std;#define inf 0x1fffffffint 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] > nodenumreturn 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"); //不连通elseprintf("%d\n",dist[nodenum]);}return 0;}

原创粉丝点击