4025 - 局域网

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB
某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用f(i,j)表示i,j之间连接的畅通程度(f(i,j)<=1000),f(i,j)值越小表示i,j之间连接越通畅,f(i,j)为0表示i,j之间无网线连接。现在我们需要解决回路问题,我们将除去一些连线,使得网络中没有回路,并且被除去网线的Σf(i,j)最大,请求出这个最大值。

题目输入

第一行两个正整数n k
接下来的k行每行三个正整数i j m表示i,j两台计算机之间有网线联通,通畅程度为m。

题目输出

一个正整数,Σf(i,j)的最大值

输入/输出样例

输入格式

5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2

输出格式

8

C语言解答

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int g[105][105]; //邻接矩阵
int minn[105];    //minn[i]存放顶点i与生成树相连的最小边权
int start[105];    //start[i]存放与minn[i]的顶点i相关联的顶点
int u[105];         //u[i]=1表示顶点i还未加入到生成树中,u[i]=0表示顶点i已加入到生成树中
int n,e,total;

void prim(){
	int i,j,k;
    memset(minn,0x7f,sizeof(minn));//初始化为maxint
    minn[1] = 0; start[1]=0;             //开始的顶点
    memset(u,1,sizeof(u));              //初始化为1,表示所有顶点未加入生成树
	for (i = 1; i <= n; i++)               //需加入n个顶点
    {
        k = 0;
        for (j = 1; j <= n; j++)     //找一个与生成树相连的权值最小的顶点k
            if (u[j] && (minn[j] < minn[k]))
                k = j;
        u[k] = 0;                         //顶点k加入生成树
		total=total+minn[k];
        for (j = 1; j <= n; j++)     //修改与k相连的所有边
            if (u[j] &&(g[k][j]!=0) && (g[k][j] < minn[j]))
				{	minn[j] = g[k][j];  
					start[j]=k; 
				}
    } 
}

int main(){
	int i,j,w,t=0;
	scanf("%d%d",&n,&e);
    while (e>0) {
		scanf("%d%d%d",&i,&j,&w);
		g[i][j]=g[j][i]=w;
		t=t+w;
		e--;
	}
	prim();
	printf("%d\n",t-total);
    return 0;
}