• codevs 5960 信使


             codevs 5960 信使

    题目描述 Description

     战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系。信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位)。指挥部设在第一个哨所。当指挥部下达一个命令后,指挥部就派出若干个信使向与指挥部相连的哨所送信。当一个哨所接到信后,这个哨所内的信使们也以同样的方式向其他哨所送信。直至所有n个哨所全部接到命令后,送信才算成功。因为准备充足,每个哨所内都安排了足够的信使(如果一个哨所与其他k个哨所有通信联系的话,这个哨所内至少会配备k个信使)。 •    现在总指挥请你编一个程序,计算出完成整个送信过程最短需要多少时间

    输入描述 Input Description

    第1行有两个整数n和m,中间用1个空格隔开,分别表示有n个哨所和m条通信线路。1<=n<=100。 •    第2至m+1行:每行三个整数i、j、k,中间用1个空格隔开,表示第i个和第j个哨所之间存在通信线路,且这条线路要花费k天。  

    输出描述 Output Description

    仅一个整数,表示完成整个送信过程的最短时间。如果不是所有的哨所都能收到信,就输出-1。

    样例输入 Sample Input

    4 4    

    1 2 4     

    2 3 7 

    2 4 1 

    3 4 6  

    样例输出 Sample Output

    11

    数据范围及提示 Data Size & Hint

    1<=n<=100

    思路:以 1 号点为起点,跑一边SPFA,求出从 1 号点到每个点的最短路中的最长路权值

    #include<algorithm>
    #include<iostream>
    #include<cstdio>
    #include<queue>
    #define MAXN 0x7fffffff
    #define M 5005
    using namespace std;
    queue<int> q;
    int n, m;
    int tot;
    int dis[M], vis[M];
    int to[M*2], net[M*2], head[M*2], cap[M*2];
    
    void add(int u, int v, int w) {        //建边
        to[++tot] = v; net[tot] = head[u]; head[u] = tot; cap[tot] = w;
        to[++tot] = u; net[tot] = head[v]; head[v] = tot; cap[tot] = w;
    }
    
    void spfa(int x) {
        for(int i = 1; i <= n; i++) vis[i] = 0, dis[i] = MAXN;
        dis[x] = 0; vis[x] = 1; q.push(x);
        while(!q.empty()) {
            int y = q.front(); q.pop(); vis[y] = 0;
            for(int i = head[y]; i; i = net[i]) {
                int t = to[i];
                if(dis[t] > dis[y]+cap[i]) {
                    dis[t] = dis[y]+cap[i];
                    if(!vis[t]) vis[t] = 1, q.push(t);
                }
            }
        }
    }
    
    int main() {
        int maxn = -1;
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= m; i++) {
            int a, b, c;
            scanf("%d%d%d", &a, &b, &c);
            add(a, b, c);
        }
        spfa(1);
        for(int i = 1; i <= n; i++)        //求最短路中的最长路
            maxn = max(maxn, dis[i]);
        printf("%d", maxn);
        return 0;
    }
  • 相关阅读:
    Spring MVC程序中得到静态资源文件css,js,图片文件的路径问题总结
    【转】MySQL数据丢失讨论
    【摘】 pt-query-digest工具一解
    【摘】Mysql备份还原数据库之mysqldump实例及参数详细说明
    【原】redis插件安装
    【摘】linux中fstab解说
    【原】mysql慢日志分析
    【原】带宽、流量单位换算关系
    【转】Linux查看内存大小和插槽
    【转】bind
  • 原文地址:https://www.cnblogs.com/v-vip/p/8728301.html
Copyright © 2020-2023  润新知