欢迎来到PJCK的博客

(最小生成树 Prim) nyoj1403-沟通无限校园网

题目描述:

校园网是为学校师生提供资源共享、信息交流和协同工作的计算机网络。校园网是一个宽带、具有交互功能和专业性很强的局域网络。如果一所学校包括多个学院及部门,也可以形成多个局域网络,并通过有线或无线方式连接起来。原来的网络系统只局限于以学院、图书馆为单位的局域网,不能形成集中管理以及各种资源的共享,个别学院还远离大学本部,这些情况严重地阻碍了整个学校的网络化需求

 

无向连通图G=VE来表示通信网络,V表示顶点集,E表示边集。把各个单位抽象为图中的顶点,顶点与顶点之间的边表示单位之间的通信网络,边的权值表示布线的费用。如果两个节点之间没有连线,代表这两个单位之间不能布线,费用为无穷大。现在需要设计网络电缆布线,将各个单位的局域网络连通起来,如何设计能够使费用最少呢?

 

输入描述:

第一行是一个整型数m(m<100)表示共有m组测试数据。
每组测试数据的第一行是两个整数n,c(1<n,c<1000)表示该测试数据有n个顶点c条边。
随后的c行,每行有3个正整数u,v,w(0<u,v<=n, 0<w<10000),分别表示边的两个顶点编号u,v及两顶点之间的费用。

输出描述:

对于每一组输入,输出最小费用值。
每组的输出占一行。

样例输入:

2
7 12
1 2 23
1 6 28
1 7 36
2 3 20
2 7 1
3 4 15
3 7 4
4 5 3
4 7 9
5 6 17
5 7 16
6 7 25
4 6
1 2 10
1 4 5
1 3 8
2 3 8
2 4 11
3 4 8

样例输出:

57
21

------------------------------------------------------------------------------------------------------------
Prim模板题,注意最后输出时注意也有可能建立不了最小生成树的情况,也就是权重之和可能为无穷大。
C++代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1002;
int mp[maxn][maxn],lowcost[maxn];
bool flag[maxn];
const int INF = 0x3f3f3f3f;
void Prim(int n,int u0,int mp[maxn][maxn]){
    flag[u0] = true;
    int i,j;
    for(i = 1;i <= n; i++){
        if(i != u0){
            lowcost[i] = mp[u0][i];
            flag[i] = false;
        }
        else{
            lowcost[i] = 0;
        }
    }
    for(i = 1; i <= n; i++){
        int temp = INF,t = u0;
        for(j = 1; j <= n; j++){
            if(!flag[j] && lowcost[j] < temp){
                t = j;
                temp = lowcost[j];
            }
        }
        if(t == u0) break;
        flag[t] = true;
        for(j = 1; j <= n; j++){
            if(!flag[j] && lowcost[j] > mp[t][j]){
                lowcost[j] = mp[t][j];
            }
        }
    }
}
int main(){
    int m;
    cin>>m;
    while(m--){
        int n,c;
        cin>>n>>c;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++)
                if(i!=j)
                    mp[i][j] = INF;
                else
                    mp[i][j] = 0;
        }
        int u,v,w;
        for(int i = 1; i <= c; i++){
            cin>>u>>v>>w;
            if(w < mp[u][v])
                mp[u][v] = mp[v][u] = w;
        }
        Prim(n,1,mp);
        int sum = 0;
        for(int i = 1; i <= n; i++)
            sum+=lowcost[i];
        if(sum < INF)    //注意!!!!!!!!!!! 
            cout<<sum<<endl;
        else
            cout<<0<<endl;
    }
    return 0;
}

 

posted @ 2019-04-02 17:54  PJCK  阅读(146)  评论(0编辑  收藏  举报