zoukankan      html  css  js  c++  java
  • 洛谷 P1186 玛丽卡

    题目描述

    麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。

    因为她和他们不住在同一个城市,因此她开始准备她的长途旅行。

    在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间。

    麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路。无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市。

    玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车。麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保证他的女朋友离开该城市足够远。

    编写程序,帮助麦克找出玛丽卡按最短路线通过不堵车道路到达他所在城市所需的最长时间(用分钟表示)。

    输入输出格式

    输入格式:

     

    第一行有两个用空格隔开的数N和M,分别表示城市的数量以及城市间道路的数量。1≤N≤1000,1≤M≤N*(N-1)/2。城市用数字1至N标识,麦克在城市1中,玛丽卡在城市N中。

    接下来的M行中每行包含三个用空格隔开的数A,B和V。其中1≤A,B≤N,1≤V≤1000。这些数字表示在A和城市B中间有一条双行道,并且在V分钟内是就能通过。

     

    输出格式:

     

    输出文件的第一行中写出用分钟表示的最长时间,在这段时间中,无论哪条路在堵车,玛丽卡应该能够到达麦克处,如果少于这个时间的话,则必定存在一条路,该条路一旦堵车,玛丽卡就不能够赶到麦克处。

     

    输入输出样例

    输入样例#1:
    5 7
    1 2 8
    1 4 10
    2 3 9
    2 4 10
    2 5 1
    3 4 7
    3 5 10
    
    输出样例#1:
    27

    思路:跑最短路枚举删边,求出的最大的最短时间即为答案。
    错因:
    1.数组问题,这已经是最近n次了,总是想偷懒而少设变量,不是MLE就是wa.
    #include<deque>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 500100
    #define M 1100
    using namespace std;
    int n,m,x,y,z,tot,sum,ans=-1;
    int vis[M],dis[M],pre[M],cutdian[MAXN*2];
    int to[MAXN*2],net[MAXN*2],cap[MAXN*2],head[MAXN*2];
    void add(int u,int v,int w){
        to[++tot]=v;net[tot]=head[u];cap[tot]=w;head[u]=tot;
        to[++tot]=u;net[tot]=head[v];cap[tot]=w;head[v]=tot;
    }
    void clear(){
        tot=0;
        memset(to,0,sizeof(to));
        memset(net,0,sizeof(net));
        memset(head,0,sizeof(head));
    }
    void spfa(int s){
        deque<int>que;
        memset(vis,0,sizeof(vis));
        memset(dis,0x3f,sizeof(dis));
        que.push_back(s);
        vis[s]=1;dis[s]=0;
        while(!que.empty()){
            int now=que.front();
            que.pop_front();
            vis[now]=0;
            for(int i=head[now];i;i=net[i]){
                if(cutdian[now*1001+to[i]])    continue;
                if(dis[to[i]]>dis[now]+cap[i]){
                    dis[to[i]]=dis[now]+cap[i];
                    if(!vis[to[i]]){
                        vis[to[i]]=1;
                        if(!que.empty()&&dis[to[i]]>dis[que.front()])
                            que.push_back(to[i]);
                        else 
                            que.push_front(to[i]);
                    }
                    if(!sum)    pre[to[i]]=now;
                }
            }    
        }
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);
        }
        spfa(1);
        sum=1;
        int t=n;
        while(t){
            cutdian[t*1001+pre[t]]=true;
            cutdian[pre[t]*1001+t]=true;
            spfa(1);
            ans=max(ans,dis[n]);
            cutdian[t*1001+pre[t]]=false;
            cutdian[pre[t]*1001+t]=false;
            t=pre[t];
        }
        printf("%d",ans);
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    微信平台的开发与集成
    自定义控件定义样式
    Android万能分辨率适应法
    Openfire配置过程,以及与php交互注意事项。
    Android 最近的一些新的功能
    自定义Ratingbar 评分控件
    解决android有的手机拍照后上传图片被旋转的问题
    Fragment 嵌套使用 Activity has been destoryed
    实现图文混排方法 类似于网易那样的
    Android 自定义View及其在布局文件中的使用示例
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7413217.html
Copyright © 2011-2022 走看看