您的位置:首页 > 其它

【POJ】3268 - Silver Cow Party

2017-08-22 22:44 281 查看
http://poj.org/problem?id=3268

N 个农场的 N 头牛去农场 X 嗨皮,M 条有向路径。

每头牛来回都挑最短的路走,求它们走的路的最大长度?

做两次spfa。

然后逐个点进行统计。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>

using namespace std;

const int INF=99999999999;
const int maxV=1001;
const int maxE=100001;

struct Edge{
int to;
int val;
int next;
}e[maxE];

int N,M,X;
int num;
int head[maxV];
int dis[maxV];
int sum[maxV];
bool vis[maxV];

void add(int from,int to,int val){
e[num].to=to;
e[num].val=val;
e[num].next=head[from];
head[from]=num++;
}

void SPFA(){
memset(vis,false,sizeof(vis));
for (int i=1;i<=N;i++){
dis[i]=INF;
}
dis[X]=0;
vis[X]=true;
queue <int> q;
q.push(X);
while (!q.empty()){
int now=q.front();
q.pop();
vis[now]=false;

for (int i=head[now];i!=-1;i=e[i].next){
int v=e[i].to;
if (dis[v]>dis[now]+e[i].val){
dis[v]=dis[now]+e[i].val;
if (!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
}
for (int i=1;i<=N;i++){
sum[i]+=dis[i];
}
}
int main(){

memset(sum,0,sizeof(sum));

cin >> N >> M >> X;

int from[maxE];
int to[maxE];
int val[maxE];
for (int
4000
i=0;i<M;i++){
cin >> from[i] >> to[i] >> val[i];
}

num=0;
memset(head,-1,sizeof(head));
for (int i=0;i<M;i++){
add(from[i],to[i],val[i]);
}
SPFA();

num=0;
memset(head,-1,sizeof(head));
for (int i=0;i<M;i++){
add(to[i],from[i],val[i]);
}
SPFA();

int ans=-1;
for (int i=1;i<=N;i++){
ans=max(ans,sum[i]);
}
cout << ans << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: