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;
}
题目大意:有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;
}
相关文章推荐
- Linux下快速删除大量文件/文件夹方法
- HDU 2102 A计划【BFS广搜】
- dialog弹出div的方法001
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- linux中安装mysql
- Flume环境部署和配置详解及案例大全
- 典型的非对称加密算法 RSA
- css计数器详解
- STL 优先队列
- MySQL优化
- 用ACE实现生产者-消费者模式
- Linux端口占用
- 编程通用篇(算法,模式)
- C语言:指针及其运算
- hdu 1180
- CocoaPods安装教程
- opencv——hough变换
- Javascript对cookie的“增删查改”
- R 数据分析
- linux查看端口占用及强制释放端口