首页 > 其他 > 详细

玛丽卡

时间:2019-07-15 13:53:14      阅读:86      评论:0      收藏:0      [点我收藏+]

题面

先跑一遍最短路,将最短路的路径记录下来,

然后枚举每一条最短路的边,将其断掉,记录此时的1-n的时间

取其中最大的一个时间即为所求

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,Cnt,Flag,Ans;
int Head[1005],Dis[1005],Cut[1005][1005],f[1005],Inq[1005];
struct Node{
    int to,Next,w;
}e[1000005];
inline void Insert(int u,int v,int w){
    e[++Cnt].to = v;
    e[Cnt].Next = Head[u];
    Head[u] = Cnt;
    e[Cnt].w = w;
}
inline void Spfa(){
    queue<int> q;
    memset(Inq,0,sizeof(Inq));
    memset(Dis,INF,sizeof(Dis));
    q.push(1);
    Dis[1] = 0;
    while(!q.empty()){
        int u = q.front();
        q.pop();
        Inq[u] = 0;
        for(int i=Head[u];i;i=e[i].Next){
            if(Cut[u][e[i].to] == 0 && Dis[e[i].to] > Dis[u] + e[i].w){
                if(!Flag)f[e[i].to] = u;
                Dis[e[i].to] = Dis[u] + e[i].w; 
                if(!Inq[e[i].to]){
                    Inq[e[i].to] = 1;
                    q.push(e[i].to);
                }
            }
        }
    }
}
inline int Read(){
    int Out = 0,f = 1;char ch = getchar();
    while(!isdigit(ch)){if(ch == ‘-‘)f = -1;ch = getchar();}
    while(isdigit(ch)){Out = Out * 10 + ch - ‘0‘;ch = getchar();}
    return Out * f;
}
int main(){
    n = Read();
    m = Read();
    for(int i=1;i<=m;i++){
        int u = Read(),v = Read(),w = Read();
        Insert(u,v,w);
        Insert(v,u,w);
    }
    Spfa();
    Flag = 1;
    for(int i=n;i!=1;i=f[i]){
        Cut[f[i]][i] = 1;
        Cut[i][f[i]] = 1;
        Spfa();
        Cut[f[i]][i] = 0;
        Cut[i][f[i]] = 0;
        Ans = Ans > Dis[n] ? Ans:Dis[n];
    }
    printf("%d\n",Ans);
    return 0;
}

  

玛丽卡

原文:https://www.cnblogs.com/ainiyuling/p/11188411.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!