[kuangbin带你飞]专题四 最短路练习 S POJ 3169
2016-10-14 13:26
423 查看
题目地址:https://vjudge.net/contest/66569#problem/S
思路:一开始在纠结是最长路还是最短路,随手试了两个例子发现应该还是最短路,因为最长路并不一定能满足所有牛……然后想怎么建图,最初我建的是双向边,一条为负一条为正,WA了两次。仔细考虑了一下,发现了错误的地方,那就是一个为最小值一个为最大值的建法应该是不一样的。最大值的部分只需为正的边就可以了。最后就是跑spfa,如果有环就说明无法实现。但是这里我还是有个不懂得地方,就是我加了一段判断是否是顺序的之后就错了,题目的意思是可以打乱顺序排队吗……
补:看了下别人的题解……感觉这题我写出来完全是蒙的= =
题解地址:http://www.cnblogs.com/tanhehe/archive/2013/02/27/2935726.html
对于任意i号奶牛,1<=i<N,在距离上应该满足:
D[i+1] - D[i] >= 0
对于每个好感的描述(i,j,k),假设i<=j,体现到距离上的要求就是:
D[j] - D[i] <= k
对于每个反感的描述(i,j,k),假设i<=j,体现到距离上的要求就是:
D[j] - D[i] >= k
写成我们约定的形式:
D[i] - D[i+1] <= 0
D[j] -D[i ]<= k
D[i] - D[j] <= - k
1.对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到的是最大值(本题求的就是最大值),对于不等式 a - b >= c ,建一条 b 到 a 的权值为 c 的边,求的是最长路,得到的是最小值。
2.如果检测到负环,那么无解。
3.如果d[]没有更新,那么可以是任意解。
AC代码:
思路:一开始在纠结是最长路还是最短路,随手试了两个例子发现应该还是最短路,因为最长路并不一定能满足所有牛……然后想怎么建图,最初我建的是双向边,一条为负一条为正,WA了两次。仔细考虑了一下,发现了错误的地方,那就是一个为最小值一个为最大值的建法应该是不一样的。最大值的部分只需为正的边就可以了。最后就是跑spfa,如果有环就说明无法实现。但是这里我还是有个不懂得地方,就是我加了一段判断是否是顺序的之后就错了,题目的意思是可以打乱顺序排队吗……
补:看了下别人的题解……感觉这题我写出来完全是蒙的= =
题解地址:http://www.cnblogs.com/tanhehe/archive/2013/02/27/2935726.html
对于任意i号奶牛,1<=i<N,在距离上应该满足:
D[i+1] - D[i] >= 0
对于每个好感的描述(i,j,k),假设i<=j,体现到距离上的要求就是:
D[j] - D[i] <= k
对于每个反感的描述(i,j,k),假设i<=j,体现到距离上的要求就是:
D[j] - D[i] >= k
写成我们约定的形式:
D[i] - D[i+1] <= 0
D[j] -D[i ]<= k
D[i] - D[j] <= - k
1.对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到的是最大值(本题求的就是最大值),对于不等式 a - b >= c ,建一条 b 到 a 的权值为 c 的边,求的是最长路,得到的是最小值。
2.如果检测到负环,那么无解。
3.如果d[]没有更新,那么可以是任意解。
AC代码:
#include<iostream> #include<cstdio> #include<queue> #include<vector> #include<cstring> #define INF 0x3f3f3f3f using namespace std; const int maxn=1000+5; vector<pair<int,int> >E[maxn]; long long d[maxn]; int in[maxn]; bool vis[maxn]; int n,m1,m2; int spfa(int s) { queue<int>q; vis[s]=true; d[s]=0; q.push(s); while(!q.empty()) { int now=q.front(); q.pop(); vis[now]=false; if(in[now]++>n) return 1; for(int i=0;i<E[now].size();i++) { int v=E[now][i].first; if(d[v]>d[now]+E[now][i].second) { d[v]=d[now]+E[now][i].second; if(vis[v]) continue; vis[v]=true; q.push(v); } } } return 0; } void init() { for(int i=0;i<maxn;i++) { E[i].clear(); d[i]=INF; vis[i]=false; in[i]=0; } } int main() { while(~scanf("%d%d%d",&n,&m1,&m2)) { init(); for(int i=1;i<=m1;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); int aa=max(a,b); int bb=min(a,b); E[bb].push_back(make_pair(aa,c)); } for(int i=1;i<=m2;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); int aa=max(a,b); int bb=min(a,b); E[aa].push_back(make_pair(bb,-c)); } int temp=0; temp=spfa(1); /*for(int i=2;i<=n;i++) { // printf("%d\n",d[i]); if(d[i]<d[i-1]) { temp=1; } }*/ if(temp) printf("-1\n"); else { if(d ==INF) printf("-2\n"); else printf("%I64d\n",d ); } } }
相关文章推荐
- [kuangbin带你飞]专题四 最短路练习
- [kuangbin带你飞]专题四 最短路练习 B
- [kuangbin带你飞]专题四 最短路练习 N POJ 1847
- 【算法系列学习】SPFA邻接表最短路 [kuangbin带你飞]专题四 最短路练习 F - Wormholes
- [kuangbin带你飞]专题四 最短路练习 P
- [kuangbin带你飞]专题四 最短路练习 B
- [kuangbin带你飞]专题四 最短路练习D
- [kuangbin带你飞]专题四 最短路练习-E
- [kuangbin带你飞]专题四 最短路练习 E POJ 1860
- [kuangbin带你飞]专题四 最短路练习 K POJ 3159
- [kuangbin带你飞]专题四 最短路练习 MN
- [kuangbin带你飞]专题四 最短路练习 A-E
- [kuangbin带你飞]专题四 最短路练习
- [kuangbin带你飞]专题四 最短路练习 -F
- [kuangbin带你飞]专题四 最短路练习 R
- [kuangbin带你飞]专题四 最短路练习 -A - Til the Cows Come Home
- [kuangbin带你飞]专题四 最短路练习 O LightOJ 1074
- [kuangbin带你飞]专题四 最短路练习
- [kuangbin带你飞]专题四 最短路练习 A
- [kuangbin带你飞]专题四 最短路练习H,I,J