C 1376:信使(msner)
【題目描述】
戰(zhàn)爭時期,前線有n個哨所,每個哨所可能會與其他若干個哨所之間有通信聯(lián)系。信使負責在哨所之間傳遞信息,當然,這是要花費一定時間的(以天為單位)。指揮部設在第一個哨所。當指揮部下達一個命令后,指揮部就派出若干個信使向與指揮部相連的哨所送信。當一個哨所接到信后,這個哨所內(nèi)的信使們也以同樣的方式向其他哨所送信。直至所有n個哨所全部接到命令后,送信才算成功。因為準備充足,每個哨所內(nèi)都安排了足夠的信使(如果一個哨所與其他k個哨所有通信聯(lián)系的話,這個哨所內(nèi)至少會配備k個信使)。
現(xiàn)在總指揮請你編一個程序,計算出完成整個送信過程最短需要多少時間。
【輸入】
第1行有兩個整數(shù)n和m,中間用1個空格隔開,分別表示有n個哨所和m條通信線路,且1≤n≤100。
第2至m+1行:每行三個整數(shù)i、j、k,中間用1個空格隔開,表示第i個和第j個哨所之間存在通信線路,且這條線路要花費k天。
【輸出】
一個整數(shù),表示完成整個送信過程的最短時間。如果不是所有的哨所都能收到信,就輸出-1。
【輸入樣例】
4 4 1 2 4 2 3 7 2 4 1 3 4 6【輸出樣例】
11分析:
已知哨所之間距離,求傳完最短時間,明顯是求距離頂點最遠的最短距離,所以是Dijkstra算法,本題幾乎就是按照題目描述,用Dijkstra算法打代碼,幾乎沒有什么坑,只要細心認真,最后再注意要檢測一遍看一下所有哨所都能到達,就OK了?
代碼
#include<bits/stdc++.h> using namespace std; int n,m,c[107],f[107],e[107][107],a,b,k; struct node{int id,dist;node(){}node(int i,int d){id=i;dist=d;}friend bool operator<(node a,node b){return a.dist>b.dist;} }; priority_queue<node>pque; int dij(int sid){memset(c,0x3f,sizeof(c));c[sid]=0;pque.push(node(sid,c[sid]));while(pque.size()){node from=pque.top();pque.pop();if(f[from.id])continue;f[from.id]=true;for(int i=1;i<=n;i++){if(e[from.id][i]!=0&&c[i]>e[from.id][i]+from.dist){c[i]=e[from.id][i]+from.dist;pque.push(node(i,c[i])); }}}int result=0;for(int i=1;i<=n;i++){result=max(result,c[i]);}return result; } int main(){cin>>n>>m;for(int i=1;i<=m;i++){cin>>a>>b>>k;e[a][b]=k;e[b][a]=k; }int cnt=dij(1);for(int i=1;i<=n;i++){if(f[i]==false){cnt=-1;}}cout<<cnt;return 0; }總結(jié)
以上是生活随笔為你收集整理的C 1376:信使(msner)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDBC 数据库连接
- 下一篇: 美国行记(二):东部小镇移动通信初体验