zoukankan      html  css  js  c++  java
  • codeforces1196F K-th Path 全源k短路

    网址:http://codeforces.com/contest/1196/problem/F

    题意:

    求一个无向无环无重边的连通图的全源$k$短路。点数$n$,边数$m$,$k$的范围分别是$2e5,frac{n(n-1)}{2} ,min(m,400)$。

    题解:

    这个题解属实牛逼,还能这么操作:对所有的边按权重从小到大排序,然后选取前$min(m,k)$条,然后使用这些边构造新图跑一遍$Floyd$算法,然后对得到的大于$0$的最短路从小到大排序,选第$k$个即可。这个算法如何证明答案一定在其中?证明:$kleq m$恒成立,我们选出的最小的$k$条边中,若这$k$条边都不连通,则$k$短路就是最大的那一条边,如果连通,则路径数将增加,显然第$k$短路在其中。

    AC代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN=200005;
    struct edge
    {
        int u,v,w;
        bool operator<(const edge &a)const
        {
            return w<a.w;
        }
    };
    edge e[MAXN];
    int hashing[MAXN];
    long long G[1005][1005],E[1005*1005+10];
    void init()
    {
        memset(G,0x3f3f3f3f,sizeof(G));
        for(int i=0;i<1005;++i)
            G[i][i]=0;
    }
    long long solve(int k,int m)
    {
        init();
        memset(hashing,0,sizeof(hashing));
        sort(e,e+m);
        m=min(k,m);
        int pos=0;
        for(int i=0;i<m;++i)
        {
            if(!hashing[e[i].u])
                hashing[e[i].u]=++pos;
            if(!hashing[e[i].v])
                hashing[e[i].v]=++pos;
            G[hashing[e[i].u]][hashing[e[i].v]]=e[i].w;
            G[hashing[e[i].v]][hashing[e[i].u]]=e[i].w;
        }
        for(int l=1;l<=2*m;++l)
            for(int i=1;i<=2*m;++i)
                for(int j=1;j<=2*m;++j)
                    G[i][j]=min(G[i][j],G[i][l]+G[l][j]);
        pos=0;
        for(int i=1;i<=2*m;++i)
            for(int j=i+1;j<=2*m;++j)
                if(G[i][j]<0x3f3f3f3f3f3f3f3f)
                    E[pos++]=G[i][j];
        sort(E,E+pos);
        return E[k-1];
    }
    int main()
    {
        int n,m,k;
        cin>>n>>m>>k;
        for(int i=0;i<m;++i)
            cin>>e[i].u>>e[i].v>>e[i].w;
        cout<<solve(k,m)<<endl;
        return 0;
    }
    
  • 相关阅读:
    深入理解HTTP Session
    java中使用队列:java.util.Queue
    throws/throw Exception 异常应用
    Log4j实现对Java日志的配置全攻略
    java中volatile关键字的含义
    hibernate调用oracle存储过程||函数
    手势仿QQ侧滑---秀清
    归档和解档---秀清
    全局定义UINavigationContoller--By秀清
    重力感应 加速计- By严焕培
  • 原文地址:https://www.cnblogs.com/Aya-Uchida/p/11255413.html
Copyright © 2011-2022 走看看