双向存图解题

P1629 邮递员送信 

P1342 请柬 

P1821[USACO07FEB]银牛派对Silver Cow Party

都是求的往返的最大,最小路径,用堆优化的dijkstra跑两遍就行,都是板子题

银牛派对的代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

int dis1[1002],dis2[1002],hd1[1002],hd2[1009];
bool vis[1009];
int tot,n,m,s,maxn;
struct llo{
    int to,nxt,w;
} e1[100002],e2[100002];
void add(int fr,int to,int w){
    tot++;
    e1[tot]=(llo){to,hd1[fr],w};
    hd1[fr]=tot;
    e2[tot]=(llo){fr,hd2[to],w};
    hd2[to]=tot;
}
struct heap{
    int u,d;
    friend bool operator <(heap x,heap y){
        return x.d>y.d;
    }
};
void diji1(int s){
    memset(dis1,0x7f,sizeof(dis1));
    memset(vis,0,sizeof(vis));
    priority_queue <heap> q;
    dis1[s]=0;
    q.push((heap){s,0});
    while(!q.empty()){
        int u=q.top().u;q.pop();
        if(vis[u])    continue;
        vis[u]=1;
        for(int i=hd1[u];i;i=e1[i].nxt){
            int v=e1[i].to;
            if(dis1[v]>dis1[u]+e1[i].w){
                dis1[v]=dis1[u]+e1[i].w;
                if(!vis[v])
                    q.push((heap){v,dis1[v]});
            }
        }
    }
}
void diji2(int s){
    memset(dis2,0x7f,sizeof(dis2));
    memset(vis,0,sizeof(vis));
    priority_queue <heap> q;
    dis2[s]=0;    
    q.push((heap){s,0});
    while(!q.empty()){
        int u=q.top().u;q.pop();
        if(vis[u])    continue;
        vis[u]=1;
        for(int i=hd2[u];i;i=e2[i].nxt){
            int v=e2[i].to;
            if(dis2[v]>dis2[u]+e2[i].w){
                dis2[v]=dis2[u]+e2[i].w;
                if(!vis[v])
                    q.push((heap){v,dis2[v]});
            }
        }
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=m;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    diji1(s);
    diji2(s);
    for(int i=1;i<=n;i++){
        if(i==s)    continue;
        else maxn=max(maxn,dis1[i]+dis2[i]);
    }
    printf("%d",maxn);
    return 0;
} 
View Code

 

转载于:https://www.cnblogs.com/jindui/p/11215651.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值