zoukankan      html  css  js  c++  java
  • POJ1125 Stockbroker Grapevine 最短路

    这题要处理的地方的就是一个人可以同时向多个人传递消息,也就是说一条消息的传递时间由最长的那一条路径所决定,因为可以同时进行嘛,所以就求某一点到所有点的最短路,然后再寻找一条最长的路劲,枚举每个顶点作为起点就可以了。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<map>
    #include<cstring>
    #include<vector>
    #include<string>
    #define inf 0x3f3f3f3f
    #define LL long long
    using namespace std;
    
    int N, G[105][105], dis[105], vis[105];
    
    bool Dijkstra(int s, int &ret) {
        int pos, Min;
        ret = 0;
        memset(dis, 0x3f, sizeof (dis));
        memset(vis, 0, sizeof (vis));
        dis[s] = 0;
        for (int i = 1; i <= N; ++i) {
            Min = inf;
            for (int j = 1; j <= N; ++j) {
                if (!vis[j] && Min > dis[j]) {
                    pos = j, Min = dis[j];
                }
            }
            if (Min == inf) {
                return false;
            } else {
                vis[pos] = 1;
                for (int j = 1; j <= N; ++j) {
                    if (!vis[j] && G[pos][j] != inf && dis[j] > dis[pos] + G[pos][j]) {
                        dis[j] = dis[pos] + G[pos][j];    
                    }
                }
            }
        }
        for (int i = 1; i <= N; ++i) {
            ret = max(ret, dis[i]);    
        }
        return true;
    }
    
    int main()
    {
        int a, b, M, flag, Min, num, ret;
        while (scanf("%d", &N), N) {
            flag = 0;
            Min = inf;
            memset(G, 0x3f, sizeof (G));
            for (int i = 1; i <= N; ++i) {
                scanf("%d", &M);
                for (int j = 1; j <= M; ++j) {
                    scanf("%d %d", &a, &b);
                    G[i][a] = b;
                }
            } 
            for (int i = 1; i <= N; ++i) {
                int t;
                if (Dijkstra(i, t)) {
                    flag = 1;
                    if (Min > t) {
                        Min = t, num = i;
                    }
                }
            }
            if (!flag) puts("disjoint");
            else printf("%d %d\n", num, Min);
        }
        return 0;
    }
  • 相关阅读:
    Leetcode 191.位1的个数 By Python
    反向传播的推导
    Leetcode 268.缺失数字 By Python
    Leetcode 326.3的幂 By Python
    Leetcode 28.实现strStr() By Python
    Leetcode 7.反转整数 By Python
    Leetcode 125.验证回文串 By Python
    Leetcode 1.两数之和 By Python
    Hdoj 1008.Elevator 题解
    TZOJ 车辆拥挤相互往里走
  • 原文地址:https://www.cnblogs.com/Lyush/p/2705242.html
Copyright © 2011-2022 走看看