poj 3169 Layout (spfa + 查分约束)
和 poj 3159 相似 :
建图 时 多 b-a>=c 这种情况,对于建图时用虚拟节点 不是太懂
#include <iostream> #include <cstdio> #include <stack> #include <queue> #include <cstring> #include <algorithm> using namespace std; #define inf 999999999 #define V 1001 #define E 20001 int pnt[E],cost[E],nxt[E],e; int head[V],dist[V],vis[V],cnt[V]; void add(int u,int v,int c) { pnt[e]=v;cost[e]=c;nxt[e]=head[u];head[u]=e++; } int spfa(int s,int n) { for(int i=1;i<=n;i++) vis[i]=0,cnt[i]=0,dist[i]=inf; vis[s]=1,cnt[s]++,dist[s]=0; queue <int> p; p.push(s); while(!p.empty()) { int u=p.front(); vis[u]=0;p.pop(); for(int i=head[u];i!=-1;i=nxt[i]) { int v=pnt[i]; if(dist[v]>dist[u]+cost[i]) { dist[v]=dist[u]+cost[i]; if(!vis[v]) { vis[v]=1; p.push(v); if((++cnt[v])>=n) return -1; } } } } if(dist[n]==inf) return -2; return dist[n]; } int main() { int n,ml,md; while(scanf("%d%d%d",&n,&ml,&md)!=EOF) { e=0;memset(head,-1,sizeof(head)); while(ml--) { int u,v,c;cin>>u>>v>>c; //if(u>v) swap(u,v); add(u,v,c); } while(md--) { int u,v,c;cin>>u>>v>>c; // if(u<v) swap(u,v); add(v,u,-c); } /*for(int i=2;i<=n;i++) add(i,1,0);*/ cout<<spfa(1,n)<<endl; } return 0; }
Just a little, maybe change the world