• JOBDU 题目1100:最短路径


    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:5786

    解决:902

    题目描述:

    N个城市,标号从0到N-1,M条道路,第K条道路(K从0开始)的长度为2^K,求编号为0的城市到其他城市的最短距离

    输入:

    第一行两个正整数N(2<=N<=100)M(M<=500),表示有N个城市,M条道路
    接下来M行两个整数,表示相连的两个城市的编号

    输出:

    N-1行,表示0号城市到其他城市的最短路,如果无法到达,输出-1,数值太大的以MOD 100000 的结果输出。

    样例输入:
    4 4
    1 2
    2 3
    1 3
    0 1
    样例输出:
    8
    9
    11

    并查集+Floyd。

    并查集判断是否连通。

    //Asimple
    //#include <bits/stdc++.h>
    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <cctype>
    #include <cstdlib>
    #include <stack>
    #include <cmath>
    #include <set>
    #include <map>
    #include <string>
    #include <queue>
    #include <limits.h>
    #include <time.h>
    #define INF 0xfffffff
    #define mod 100000
    #define PI 3.14159265358979323
    #define swap(a,b,t) t = a, a = b, b = t
    #define CLS(a, v) memset(a, v, sizeof(a))
    #define debug(a)  cout << #a << " = "  << a <<endl
    #define dobug(a, b)  cout << #a << " = "  << a << " " << #b << " = " << b << endl
    using namespace std;
    typedef long long ll;
    const int maxn = 101;
    int n, m, num, T, k, len, ans, sum, x, y;
    int Map[maxn][maxn];
    int fa[maxn];
    ll qpow(ll a, ll b, ll md) {
        ll ans = 1;
        while( b ) {
            if( b & 1 ) ans = ans * a % md;
            a = a * a % md;
            b = b >> 1;
        }
        return ans;
    }
    int find(int x) {
        return x==fa[x]?x:fa[x]=find(fa[x]);
    }
     
    void solve() {
        x = find(0);
        for(int i=1; i<n; i++) {
            if( x!=find(i) ) cout << "-1" << endl;
            else cout << Map[0][i] << endl;
        }
    }
     
    void input() {
        while( cin >> n >> m ) {
            for(int i=0; i<n; i++) {
                fa[i] = i;
                Map[i][i] = 0;
            }
            for(int i=0; i<m; i++) {
                cin >> x >> y;
                num = qpow(2, i, mod);
                int xx = find(x);
                int xy = find(y);
                if( xx==xy ) continue;
                for(int j=0; j<n; j++) {
                    if( xx!=find(j) ) continue;
                    for(int k=0; k<n; k++) {
                        if( xy!=find(k) ) continue;
                        Map[j][k] = Map[k][j] = (Map[j][x] + num + Map[y][k])%mod;
                    }
                }
                fa[xy] = xx;
            }
            solve();
        }
    }
     
    int main(){
        input();
        return 0;
    }
    低调做人,高调做事。
  • 相关阅读:
    JAVA编写的一个简单的Socket实现的HTTP响应服务器
    IPTV 质量评价方法已经不适用于 OTT TV 质量评价
    AAC规格(LC,HE,HEv2)及性能对比
    洛谷 P1572 计算分数
    洛谷 P2128 赤壁之战
    洛谷 P2818 天使的起誓
    洛谷 P3914 染色计数
    洛谷 P1193 洛谷团队训练VS传统团队训练
    洛谷 P1318 积水面积
    洛谷 P1061 Jam的计数法
  • 原文地址:https://www.cnblogs.com/Asimple/p/6502632.html
Copyright © 2020-2023  润新知