BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路 Dijkstra

BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路 Dijkstra

Code:

#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin) 
#define maxn 1000000 
#define inf 0x7f7f7f7f 
using namespace std;
int cnt,s; 
int hd[maxn],to[maxn],nex[maxn],val[maxn],d[maxn],vis[maxn],f[maxn],g[maxn]; 
void add(int u,int v,int c){ 
    nex[++cnt]=hd[u],hd[u]=cnt,to[cnt]=v,val[cnt]=c; 
}
struct Edge{ 
    int u,v,c;  
    Edge(int u=0,int v=0,int c=0):u(u),v(v),c(c){} 
}edges[maxn]; 
struct Node{
    int u,dis; 
    Node(int u=0,int dis=0):u(u),dis(dis){} 
    bool operator<(Node b)const{
        return dis>b.dis; 
    }
}; 
priority_queue<Node>Q; 
void dijkstra(){
    memset(vis,0,sizeof(vis)); 
    for(int i=0;i<maxn;++i) d[i]=inf;
    d[0]=d[s]=0; 
    Q.push(Node(s,d[s])); 
    while(!Q.empty()){
        Node e=Q.top();Q.pop();
        if(vis[e.u]) continue; 
        vis[e.u]=1; 
        int u=e.u;
        for(int i=hd[u];i;i=nex[i]){
            if(d[to[i]]>d[u]+val[i]){
                d[to[i]]=d[u]+val[i];  
                Q.push(Node(to[i],d[to[i]])); 
            }
        }
    }
}
int main(){
    // setIO("input"); 
    int n,m,tot=0,ans=inf,tmp; 
    scanf("%d%d",&n,&m);
    for(int i=1,a,b,c;i<=m;++i) {
        scanf("%d%d%d",&a,&b,&c),add(a,b,c),add(b,a,c); 
        edges[++tot]=Edge(a,b,c),edges[++tot]=Edge(b,a,c); 
    }       
    s=1, dijkstra(),tmp=d[n];      
    for(int i=1;i<=n;++i) f[i]=d[i]; 
    s=n, dijkstra(); 
    for(int i=1;i<=n;++i) g[i]=d[i]; 
    for(int i=1;i<=tot;++i) {
        Edge e=edges[i]; 
        if(f[e.u]+val[i]+g[e.v]<ans&&f[e.u]+val[i]+g[e.v]>tmp) 
            ans=f[e.u]+val[i]+g[e.v]; 
    }
    printf("%d\n",ans); 
    return 0; 
}

  

posted @ 2019-05-30 09:25 EM-LGH 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值