zoukankan      html  css  js  c++  java
  • 1021 玛丽卡

    1021 玛丽卡

     

     时间限制: 2 s
     空间限制: 128000 KB
     题目等级 : 大师 Master
     
     
     
    题目描述 Description

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

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

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

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

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

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

    输入描述 Input Description

    第一行有两个用空格隔开的数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分钟内是就能通过。

    输出描述 Output Description

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

    样例输入 Sample Input

    5 7

    1 2 8

    1 4 10

    2 3 9

    2 4 10

    2 5 1

    3 4 7

    3 5 10

    样例输出 Sample Output

    27

    数据范围及提示 Data Size & Hint
     

    分类标签 Tags 点此展开 

     

    题解:

    先spfa一遍,把最短路径记下来,然后枚举路径上的边,标志位不能走,

    再spfa,取最短路的最大值 

    AC代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define N 1010
    #define INF 1061109567
    using namespace std;
    int Dis[N],head[N],q[N*N];bool vis[N];
    int lu[N],len,a[N][N],f[N],fa[N];
    struct node{
        int v,dis,pre;
    }e[N*N];
    inline int read(){
        register int x=0,f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void add(int cnt,int x,int y,int z){
        e[cnt].v=y;
        e[cnt].dis=z;
        e[cnt].pre=head[x];
        head[x]=cnt;
    }
    void spfa(int s,int t,bool flag){
        memset(f,127/3,sizeof(f));
        memset(vis,0,sizeof(vis));
        memset(q,0,sizeof(q));
        int h=0,w=1;
        q[1]=s;
        vis[s]=1;
        f[s]=0;
        while(h<w){
            int x=q[++h];
            vis[x]=0;
            for(int i=head[x];i;i=e[i].pre){
                int y=e[i].v;
                if(f[y]>f[x]+e[i].dis&&!a[x][y]){
                    f[y]=f[x]+e[i].dis;
                    fa[y]=x;
                    if(!vis[y]){
                        vis[y]=1;
                        q[++w]=y;
                    }
                }
            }
        }
    }
    int main(){
        int n,m,x,y,z;
        n=read();m=read();
        for(int i=1;i<=m;i++){
            x=read(),y=read(),z=read();
            add((i<<1)-1,x,y,z);add((i<<1),y,x,z);
        }
        spfa(1,n,1);
        for(int i=n;i;i=fa[i]) lu[++len]=i;
        for(int i=1;i<=n;i++) Dis[i]=f[i];  
        int ans=0;
        for(int i=1;i<len;i++){
            a[lu[i]][lu[i+1]]=1;
            a[lu[i+1]][lu[i]]=1;
            spfa(1,n,1);
            ans=max(ans,f[n]);
            a[lu[i]][lu[i+1]]=0;
            a[lu[i+1]][lu[i]]=0;
        }
        printf("%d",ans);
        return 0;
    }
    

      

  • 相关阅读:
    IIS7.5应用程序池集成模式和经典模式的区别介绍(转)
    (转)Extjs4 展示图片与图片的更新
    webservices发布后远程无法调试的解决方法
    .Net通过OleDb方式读取Excel
    1000个JQuery插件(转载)
    2006年中科大计算机考研复试机试题
    2. 最好使用C++转型操作符
    16. 谨记8020法则
    英语阅读理解中表示作者态度的词汇汇总
    5. 对定制的“类型转换函数”保持警觉
  • 原文地址:https://www.cnblogs.com/shenben/p/5765147.html
Copyright © 2011-2022 走看看