HDU 1595 find the longest of the shortest

 

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1595

题意:从城市1到城市N,之间共有M条路,其中有一条路损坏了,问在损坏的路径影响到达城市N的最短路径长度的情况下的到达城市N的最长路径。

分析:先用spfa求出1到N的最短路径,然后枚举这些路径,假设这条路径损坏了,求1到N的最短路,然后找出最大的即可。(用邻接矩阵存储图会TLE,用邻接表90MS+。。。)

 

Source Code:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<string>
#include<cstdlib>
using namespace std;
const int N=1005;
const int inf=0x3f3f3f3f;
int path[N],first[N],dis[N];
struct node{
    int v,w,next;
}edge[N*N];
bool mark[N][N];
int n,m,cnt;
int max(int a,int b)
{
    return a>b?a:b;
}
void add(int u,int v,int w)
{
    edge[cnt].v=v;
    edge[cnt].w=w;
    edge[cnt].next=first[u];
    first[u]=cnt++;
}
void spfa()
{
    path[1]=-1;
    bool flag[N];
    queue<int>Q;
    memset(dis,inf,sizeof(dis));
    memset(flag,false,sizeof(flag));
    dis[1]=0;
    Q.push(1);
    flag[1]=true;
    while(!Q.empty()){
        int u=Q.front();
        Q.pop();
        flag[u]=false;
        for(int i=first[u];i!=-1;i=edge[i].next){
            int v=edge[i].v;
            if(dis[v]>dis[u]+edge[i].w){
                dis[v]=dis[u]+edge[i].w;
                path[v]=u;
                if(!flag[v]){
                    flag[v]=true;
                    Q.push(v);
                }
            }
        }
    }
}
int solve()
{
    queue<int>QQ;
    bool flag[N];
    memset(dis,inf,sizeof(dis));
    memset(flag,false,sizeof(flag));
    dis[1]=0;
    flag[1]=true;
    QQ.push(1);
    while(!QQ.empty()){
        int u=QQ.front();
        flag[u]=false;
        QQ.pop();
        for(int i=first[u];i!=-1;i=edge[i].next){
            int v=edge[i].v;
            if((dis[v]>dis[u]+edge[i].w)&&(mark[u][v])){
                dis[v]=dis[u]+edge[i].w;
                if(!flag[v]){
                    flag[v]=true;
                    QQ.push(v);
                }
            }
        }
    }
    return dis[n];
}
int main()
{
    //freopen("in.txt","r",stdin);
    int u,v,w,i;
    while(scanf("%d %d",&n,&m)!=EOF){
        cnt=0;
        memset(mark,false,sizeof(mark));
        memset(first,-1,sizeof(first));
        for(i=1;i<=m;i++){
            scanf("%d %d %d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);
            mark[u][v]=mark[v][u]=true;
        }
        spfa();
        int ans=dis[n];
        for( i=n;i!=-1;i=path[i]){
            mark[i][path[i]]=mark[path[i]][i]=false;
            ans=max(ans,solve());
            mark[i][path[i]]=mark[path[i]][i]=true;
        }
        printf("%d\n",ans);
    }
    //system("pause");
    return 0;
}


 

你可能感兴趣的:(HDU 1595 find the longest of the shortest)