HDU 1595 find the longest of the shortest【次短路】

转载请注明出处:http://blog.csdn.net/a1dark

分析:经典的次短路问题、dijkstra或者SPFA都能做、先找出最短路、然后依次删掉没条边、为何正确就不证明了、了解思想直接A掉、注意记录路径

#include<stdio.h>
#include<string.h>
#define INF 0x7ffffff
#define N 1010
int mpt[N][N];
int path[N];
int n,m;
void init(){
    for(int i=1;i<N;i++){
        for(int j=1;j<N;j++){
            if(i==j)mpt[i][j]=0;
            else mpt[i][j]=INF;
        }
    }
}
int dist[N];
void dij(){
    int vis[N];
    memset(path,-1,sizeof(path));
    for(int i=1;i<=n;i++){
        vis[i]=0;
        dist[i]=mpt[1][i];
    }
    dist[1]=0;
    vis[1]=1;
    for(int i=1;i<n;i++){
        int minx=INF;
        int w=0;
        for(int j=1;j<=n;j++){
            if(vis[j]==0&&dist[j]<minx){
                minx=dist[j];
                w=j;
            }
        }
        vis[w]=1;
        for(int j=1;j<=n;j++){
            if(vis[j]==0&&mpt[w][j]+dist[w]<dist[j]){
                dist[j]=mpt[w][j]+dist[w];
                path[j]=w;
            }
        }
    }
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        init();
        for(int i=0;i<m;i++){
            int s,t,v;
            scanf("%d%d%d",&s,&t,&v);
            if(v<mpt[s][t]){
                mpt[s][t]=v;
                mpt[t][s]=v;
            }
        }
        dij();
        int x=n;
        int dis[N];
        dis[0]=n;
        int len=1;
        while(path[x]!=-1){
            dis[len++]=path[x];
            x=path[x];
        }
        dis[len++]=1;
        int maxx=0;
        for(int i=0;i<len-1;i++){
            int temp=mpt[dis[i]][dis[i+1]];
            mpt[dis[i]][dis[i+1]]=INF;
            mpt[dis[i+1]][dis[i]]=INF;
            dij();
            if(dist[n]>maxx)
                maxx=dist[n];
            mpt[dis[i]][dis[i+1]]=temp;
            mpt[dis[i+1]][dis[i]]=temp;
        }
        printf("%d
",maxx);
    }
    return 0;
}


原文地址:https://www.cnblogs.com/james1207/p/3395175.html