现在的位置: 首页 > 综合 > 正文

POJ-1125 Stockbroker Grapevine 最短路

2012年05月31日 ⁄ 综合 ⁄ 共 1111字 ⁄ 字号 评论关闭

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

代码如下:

#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;
}

 

抱歉!评论已关闭.