• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
james1207

博客园    首页    新随笔    联系   管理    订阅  订阅

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\n",maxx);
    }
    return 0;
}


 

 

posted @ 2013-10-29 21:18  Class Xman  阅读(215)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3