POJ 3268 Silver Cow Party bfs最短路

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66569#problem/D


题意:cows要举办一个party,地点选择其中一个cow的位置,其他cow去参加,需要沿着单向边走一个来回,求他们的最小来回路程中的最大的值。


刚开始天真的写了N多个DFS,然后各种WA,只好放弃了,然后改写BFS,然后AC,然后就没有然后了,看来最短路还是写成BFS吧、。。。


代码:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define INF 0x7fffffff

using namespace std;

struct edge{
    int u,v,w;
}E[100010];

int N,M,X;
vector<int> G[2][1010];
int ans[2][1010],vis[1010];

void bfs(int op){//op为0时正向更新v,op为1时反向更新u
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=N;i++) ans[op][i]=INF;
    queue<int> Q;
    Q.push(X);
    vis[X]=1;ans[op][X]=0;
    while(!Q.empty()){
        int tp=Q.front();Q.pop();vis[tp]=0;
        for(int i=0;i<(int)G[op][tp].size();i++){
            int t=G[op][tp][i];
            int u=E[t].u,v=E[t].v,w=E[t].w;
            if(op) swap(u,v);//反向更新最小值
            if(ans[op][u]+w>=ans[op][v]) continue;
            ans[op][v]=ans[op][u]+w;
            if(!vis[v]) vis[v]=1,Q.push(v);
        }
    }
}


int main(){
    freopen("D:\\in.txt","r",stdin);
    while(cin>>N){
        cin>>M>>X;
        int a,b,c;
        for(int i=0;i<=N;i++) G[0][i].clear(),G[1][i].clear();
        for(int i=0;i<M;i++){
            scanf("%d %d %d",&a,&b,&c);
            E[i]=(edge){a,b,c};
            G[0][a].push_back(i);//以a出发的边
            G[1][b].push_back(i);//指向b的边
        }
        bfs(0);bfs(1);
        int Max=0;
        for(int i=1;i<=N;i++) {
            Max=max(Max,ans[0][i]+ans[1][i]);
        }
        cout<<Max<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值