您的位置:首页 > 其它

POJ-3268 Silver Cow Party

2016-07-21 11:13 417 查看
题目链接http://acm.hust.edu.cn/vjudge/contest/66569#problem/D

题目大意:有N个农场,每个农场住着一个奶牛,一天,他们要到农场X开Party,问你N头牛从自己家走到X再走回去,谁最远?

解题思路:这个题为单向图又有一个固定的起点或终点,所以可以建正反两个图,分别求X到其他点的最短路,再相加找最大即可。

代码:(代码有点丑)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxm=100005;
int head[maxm],next[maxm],edge[maxm],ver[maxm];
int head2[maxm],next2[maxm],edge2[maxm],ver2[maxm];
int tot,tot2,m,n,p;
int d[1005],d2[1005];
bool vis[1005];
int ans[1005];
void add(int x,int y,int z){
ver[++tot]=y;
edge[tot]=z;
next[tot]=head[x];
head[x]=tot;
}
void add2(int x,int y,int z){
ver2[++tot2]=y;
edge2[tot2]=z;
next2[tot2]=head2[x];
head2[x]=tot;
}
void dij(){
memset(d,0x3f,sizeof(d));
d[p]=0;
for(int i=1;i<=n;i++){
int temp=1<<30;int k;
for(int j=1;j<=n;j++)
if(!vis[j]&&d[j]<temp){
temp=d[j];
k=j;
}
vis[k]=1;
for(int j=head[k];j;j=next[j])
d[ver[j]]=min(d[ver[j]],d[k]+edge[j]);
}
}
void dij2(){
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
d[p]=0;
for(int i=1;i<=n;i++){
int temp=1<<30;int k;
for(int j=1;j<=n;j++)
if(!vis[j]&&d[j]<temp){
temp=d[j];
k=j;
}
vis[k]=1;
for(int j=head2[k];j;j=next2[j])
d[ver2[j]]=min(d[ver2[j]],d[k]+edge2[j]);
}
}
int main(){
cin>>n>>m>>p;
for(int i=1;i<=m;i++){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
add2(b,a,c);
}
dij();
for(int i=1;i<=n;i++) ans[i]+=d[i];
dij2();
for(int i=1;i<=n;i++) ans[i]+=d[i];
int answer=-1;
for(int i=1;i<=n;i++) answer=max(answer,ans[i]);
cout<<answer<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: