zoukankan      html  css  js  c++  java
  • find the longest of the shortest

    #include<iostream>
    #include<vector>
    #include<string.h>
    #include<queue>
    using namespace std;
    #define INF 100000000
    vector<int > g[1002];
    int w[1002][1002],d[1002],vis[1002];
    struct edge{int u;int v;}e[100000];
    void spfa(int a,int n)
    {
        queue<int > q;
        memset(vis,0,sizeof(vis));//不在队列中
        for(int i=2;i<=n;i++)
            d[i]=INF;
    
        d[1]=0;
        q.push(1);
        vis[1]=1;
        while(!q.empty())
        {
            int a,b;
            a=q.front(); q.pop();
            for(int i=0;i<g[a].size();i++)
            {
                b=g[a][i];
                if(w[a][b]!=-1)
                {
                if(d[b]>d[a]+w[a][b])
                {
                    d[b]=d[a]+w[a][b];
                    if(vis[b]==0)
                        q.push(b);
                }
                }
            }
        }
    }
                
    
    int main()
    {
        int i,j,n,m,a,b,c;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            memset(w,-1,sizeof(w));
            for(int i=0;i<m;i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                w[a][b]=c; w[b][a]=c;
                if(c>w[a][b]&&w[a][b]!=-1)
                    continue;
                g[a].push_back(b);
                g[b].push_back(a);
            }
            spfa(1,n);//   ok
            //printf("ans %d
    ",d[n]);
            int u=n; int num=0;
            while(u!=1)
            {
                for(i=0;i<g[u].size ();i++)
                {
                    int v=g[u][i];
                    if(d[v]+w[u][v]==d[u])
                    {
                        
                        edge temp;  temp.u =u; temp.v=v;
                        e[num++]=temp;u=v;
                        break;
                    }
                }
            }
            int maxx=0;
            for(i=0;i<num;i++)
            {
                int temp;  temp=w[e[i].u ][e[i].v ];
                w[e[i].u ][e[i].v]=w[e[i].v ][e[i].u]=-1;
                spfa(1,n);
                if(d[n]>maxx)
                    maxx=d[n];
                w[e[i].u ][e[i].v]=w[e[i].v ][e[i].u]=temp;
            }
            printf("%d
    ",maxx);
    
    
    
        //    for(i=0;i<num;i++)        //ok
            //    printf("edge  %d  %d
    ",e[i].u,e[i].v);
            for(i=1;i<=n;i++)
                g[i].clear();
        }
        return 0;
    }
        
  • 相关阅读:
    SpringBoot基础
    开始一个新的springboot项目checklist
    五项修炼: 终生学习者
    价值流分析-改进方法论
    伯努利方程
    会计语言
    svg蒙版mask
    从svg到计算机图形学
    xflux 调节屏幕色温
    处理器架构
  • 原文地址:https://www.cnblogs.com/assult/p/3221791.html
Copyright © 2011-2022 走看看