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;
}

  

原文地址:https://www.cnblogs.com/shenben/p/5765147.html