标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10245 | Accepted: 4931 |
Description
Input
Output
Sample Input
4 2 1 1 3 10 2 4 20 2 3 3
Sample Output
27
Hint
/* * POJ 3169 Layout * 给你n条奶牛,其中一些两个距离不能超过D,而有些必须大于等于D,问1到n的最大距离 * * 典型的差分约束,全部化为小于等于的不等式,跑SPFA即可,由于存在负环,不能用Dijkstra。 */ #include <stdio.h> #include <string.h> #include <iostream> #include <queue> using namespace std; const int MAXN = 1010; const int MAXE = 20020; const int INF = 0x3f3f3f3f; struct Edge { int to; int w; int next; }edge[MAXE]; int head[MAXN],tol; bool vis[MAXN]; int cnt[MAXN]; int Q[MAXN]; int dis[MAXN]; void init() { tol=0; memset(head,-1,sizeof(head)); } void addedge(int u,int v,int w)//加边 { edge[tol].to=v; edge[tol].w=w; edge[tol].next=head[u]; head[u]=tol++; } bool SPFA(int st,int n) { int front=0,rear=0; for(int v=1;v<=n;v++)//初始化 { if(v==st) { Q[rear++]=v; vis[v]=true; cnt[v]=1; dis[v]=0; } else { vis[v]=false; cnt[v]=0; dis[v]=INF; } } while(front!=rear) { int u=Q[front++]; vis[u]=false; if(front>=MAXN)front=0; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(dis[v]>dis[u]+edge[i].w) { dis[v]=dis[u]+edge[i].w; if(!vis[v]) { vis[v]=true; Q[rear++]=v; if(rear>=MAXN)rear=0; if(++cnt[v]>n) return false; } } } } return true; } int main() { int n,ml,md; int u,v,w; scanf("%d%d%d",&n,&ml,&md); init(); while(ml--) { scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); } while(md--) { scanf("%d%d%d",&u,&v,&w); addedge(v,u,-w); } if(!SPFA(1,n)) printf("-1\n"); else if(dis[n]==INF) printf("-2\n"); else printf("%d\n",dis[n]); return 0; }
标签:
原文地址:http://www.cnblogs.com/wangdongkai/p/5854170.html