zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    MySQLSource-Flume
    Flume
    Hive| ETL清洗& 查询练习
    Hive-04 压缩| 存储
    Hive-03 查询
    Hive-02 DDL| DML
    shell基本用法
    Hive-01 配置| 架构原理
    HDFS-HA高可用 | Yarn-HA
    react-路由和Ant design
  • 原文地址:https://www.cnblogs.com/james1207/p/3395175.html
Copyright © 2011-2022 走看看