• 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;
    }
        
  • 相关阅读:
    php CI框架基础知识
    1206 多表单提交,强类型
    1205 Mvc的Razor语法
    1204 Mvc
    1117 邮件验证
    1115 模板页
    1113 Ajax
    1110 Jquary动画
    1108 Jquary
    1107 Linq高级查询
  • 原文地址:https://www.cnblogs.com/assult/p/3221791.html
Copyright © 2020-2023  润新知