信使

Problem Description
战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系。信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位)。指挥部设在第一个哨所。当指挥部下达一个命令后,指挥部就派出若干个信使向与指挥部相连的哨所送信。当一个哨所接到信后,这个哨所内的信使们也以同样的方式向其他哨所送信。直至所有n个哨所全部接到命令后,送信才算成功。因为准备充足,每个哨所内都安排了足够的信使(如果一个哨所与其他k个哨所有通信联系的话,这个哨所内至少会配备k个信使)。现在总指挥请你编一个程序,计算出完成整个送信过程最短需要多少时间。
Input
有多组输入数据,每组数据的第一行有两个整数n和m,分别表示有n个哨所和m条通信线路。(1<=n<=100)。
第2至m+1行:每行三个整数i、j、k,表示第i个和第j个哨所之间存在通信线路,且这条线路要花费k天。
Output
对于每组输入,输出一个整数,表示完成整个送信过程的最短时间。如果不是所有的哨所都能收到信,就输出-1。
Sample Input
4 4
1 2 4
2 3 7
2 4 1
3 4 6
Sample Output
11
//关键字:迪杰斯特拉算法
//标程:
#include<cstdio>  
#include<cstring>  
#include<iostream>  
using namespace std;  
const int c = 1010;  
int a[c][c], map[c][c], dis[c], vis[c], b[c];  
const int inf = 1 << 30;  
int main(){  
 //   freopen("a.txt","r",stdin);  
    int n, m, ans;  
    while(cin >> n >> m ){  
         
        int i, j, k, x, y, z;  
        for(i = 1; i <= n; ++ i)   
            for(j = 1;j <= n; ++ j)   
                map[i][j] = inf;  
        for(i = 1; i <= m; ++ i) {  
            cin >> x >> y >> z;  
            a[x][++ a[x][0]] = y;  
            a[y][++ a[y][0]] = x;  
            map[y][x] = map[x][y] = z;  
        }  
        ans = 0;  
        memset(dis,0,sizeof(dis));    
        memset(vis,0,sizeof(vis));  
        for(j = 1;j <= n; ++ j)   
            dis[j] = map[1][j];  
        dis[1]=0;   vis[1]=1;  
        for(j = 1; j <= n-1; ++ j){  
            int minn = inf;  
            for(k = 1; k <= n; ++ k)   
                if(vis[k] == 0 && dis[k] < minn) {   
                    x = k; minn = dis[k];  
                }    
            vis[x]=1;  
            for(k = 1; k <= a[x][0]; ++ k)   
                if(vis[a[x][k]] == 0 && map[x][a[x][k]] < inf && dis[x] + map[x][a[x][k]] < dis[a[x][k]])   
                    dis[a[x][k]] = dis[x] + map[x][a[x][k]];  
        }   
        for(i = 1; i <= n; ++ i)  
            if(ans < dis[i]) ans = dis[i];  
        if(ans != inf) cout << ans << endl;
		else cout << "-1" << endl;
    }  
    return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值