Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 15121 | Accepted: 7265 |
Descriptionnode
Inputios
Outputapp
Sample Inputui
4 2 1 1 3 10 2 4 20 2 3 3
Sample Outputspa
27
Hintcode
差分約束系統blog
對於兩頭牛之間距離不大於d 有 dis[a]+d>=dis[b]three
對於兩頭牛之間距離不小於d 有 dis[a]+d<=dis[b]ip
//差分約束系統 #include <iostream> #include <cstring> #include <queue> #include <vector> #include <algorithm> #include <cstdio> using namespace std; #define INF 1044266558 int n,a,b,u,t,w; int dis[1006],vis[1006],in[1006]; int head[1006]; struct node{ int to,w,next; }edge[30006]; int ans=0; void add_edge(int u,int v,int w){ edge[ans].to=v; edge[ans].w=w; edge[ans].next=head[u]; head[u]=ans++; } queue<int>q; int bfs(int s){ memset(dis,62,sizeof(dis)); memset(vis,0,sizeof(vis)); memset(in,0,sizeof(in)); in[s]=1; vis[s]=1; dis[s]=0; q.push(s); while(!q.empty()){ int e=q.front(); q.pop(); in[e]=0; if(vis[e]>n) return 1; for(int i=head[e];i!=-1;i=edge[i].next){ int u=edge[i].to; int s=edge[i].w; if(dis[u]>dis[e]+s){ dis[u]=dis[e]+s; vis[u]++; if(!in[u]){ in[u]=1; q.push(u); } } } } return 0; } int main(){ scanf("%d%d%d",&n,&a,&b); memset(head,-1,sizeof(head)); for(int i=0;i<a;i++){ scanf("%d%d%d",&u,&t,&w); add_edge(u,t,w); } for(int i=0;i<b;i++){ scanf("%d%d%d",&u,&t,&w); add_edge(t,u,-w); } if(bfs(1)) printf("-1\n"); else if(dis[n]==INF) printf("-2\n"); else printf("%d\n",dis[n]); return 0; }
//差分約束系統 #include <iostream> #include <cstring> #include <queue> #include <vector> #include <algorithm> #include <cstdio> using namespace std; #define INF 1044266558 typedef pair<int,int> P; vector<pair<int,int> >v[1006]; int n,a,b,u,t,w; int dis[1006],vis[1006],in[1006]; queue<int>q; int bfs(int s){ memset(dis,62,sizeof(dis)); memset(vis,0,sizeof(vis)); memset(in,0,sizeof(in)); in[s]=1; vis[s]=1; dis[s]=0; q.push(s); while(!q.empty()){ int e=q.front(); q.pop(); in[e]=0; if(vis[e]>n) return 1; for(int i=0;i<v[e].size();i++){ int u=v[e][i].first; int s=v[e][i].second; if(dis[u]>dis[e]+s){ dis[u]=dis[e]+s; vis[u]++; if(!in[u]){ in[u]=1; q.push(u); } } } } return 0; } int main(){ scanf("%d%d%d",&n,&a,&b); for(int i=0;i<a;i++){ scanf("%d%d%d",&u,&t,&w); v[u].push_back(P(t,w)); } for(int i=0;i<b;i++){ scanf("%d%d%d",&u,&t,&w); v[t].push_back(P(u,-w)); } if(bfs(1)) printf("-1\n"); else if(dis[n]==INF) printf("-2\n"); else printf("%d\n",dis[n]); return 0; }
類似題:hdu 3592string