您的位置:首页 > 其它

[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代码:

#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
);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: