xmu 1074: 安全網絡 ver.1(MST模型)

1074: 安全網絡 ver.1

題目描述

  現在有個一個內部局域網絡,裏面有N臺機器。爲了某種安全原因的考慮,每兩臺機器之間的通訊都是經過加密的。由於不同機器之間傳輸的內容不同,所以他們通訊採用的加密級別也不大相同。不同的加密級別導致破解的難度不一樣,越高的加密級別破解需要的時間也越多。如果我們獲得了編號爲i的機器的完全控制權,另外我們破解了機器i和機器j之間的加密信息,那麼我們就得到了機器j的完全控制權。
  現在你通過了某種手段入侵了1號機器,得到了這臺機器的完全控制權,爲了擴大勞動果實,你準備對其餘的機器也在你的控制當中,但是由於需要破解加密信息才能控制其它機器,你又不想浪費太多時間在破解上,現在你來算算你至少需要多少時間才能完全控制整個網絡。

輸入

  輸入的第一行是一個正整數N(0 < N <= 100),表示機器的數目。
  輸入的第二行開始到第N+1行,每行N個整數,第i+1行的第j個數字Tij表示破解機器i和機器j之間的加密算法所需要的時間,範圍在[0..100,000]之間。另外Tij= Tji,Tii = 0。

輸出

  輸出完全控制所有機器的最少時間。

樣例輸入

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

樣例輸出

28

提示

  破解機器1和機器2、機器2和機器3、機器3和機器4之間的加密信息,即可完全控制所有機器。

來源

xmu


思路:完全的最小生成樹模型。這題用prim算法比較好處理輸入


代碼:

#include<bits/stdc++.h>
#define maxn 110
#define INF 0x7fffffff
using namespace std;

int Map[maxn][maxn],dis[maxn],vis[maxn];
int N;

void prim(){//Prim的算法
    memset(vis,0,sizeof(vis));
    for(int i=2;i<=N;i++) dis[i]=Map[1][i];
    vis[1]=1;int ans=0;
    for(int p=1;p<=N-1;p++){//注意只能循環N-1次
        int Min=INF,t;
        for(int i=1;i<=N;i++) if(!vis[i] && dis[i]<Min)
            Min=dis[t=i];
        ans+=Min;vis[t]=1;
        for(int i=1;i<=N;i++) if(!vis[i] && dis[i]>Map[i][t])
            dis[i]=Map[t][i];
    }
    printf("%d\n",ans);
}

int main(){
    //freopen("in.txt","r",stdin);
    while(cin>>N){
        for(int i=1;i<=N;i++) for(int j=1;j<=N;j++)
            scanf("%d",Map[i]+j);
        prim();
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章