趣学算法:沟通无限校园网 (最小生成树)
题目描述:
校园网是为学校师生提供资源共享、信息交流和协同工作的计算机网络。校园网是一个宽带、具有交互功能和专业性很强的局域网络。如果一所学校包括多个学院及部门,也可以形成多个局域网络,并通过有线或无线方式连接起来。原来的网络系统只局限于以学院、图书馆为单位的局域网,不能形成集中管理以及各种资源的共享,个别学院还远离大学本部,这些情况严重地阻碍了整个学校的网络化需求。
无向连通图G=(V,E)来表示通信网络,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算法模板题
#include<stdio.h>
#include<string.h>
#define N 1020
long long e[N][N],dis[N],book[N];
const long long inf=0x3fffffff;
int main()
{
long long i,j,t,n,m,u,v,w,min,flag,s,count;
long long sum;
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&n,&m);
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(i == j)
e[i][j] = 0;
else
e[i][j] = inf;
for(i=0;i<m;i++)
{
scanf("%lld%lld%lld", &u, &v, &w);
if(e[u][v]>w)
e[u][v] = e[v][u] = w;
}
memset(book, 0, sizeof(book));
for(i=1; i<=n; i++)
dis[i] = e[1][i];
count=1;
book[1]=1;
sum=0;
while(count<n)
{
min=inf;
flag=0;
for(j=1; j<=n; j++)
{
if(dis[j]<min && book[j] == 0)
{
flag = 1;
min = dis[j];
u = j;
}
}
if(flag == 0)
break;
book[u] = 1;
sum+= dis[u];
count++;
for(v=1; v<=n; v++)
{
if(book[v] == 0 && dis[v]>e[u][v])
dis[v] = e[u][v];
}
}
if(flag)
printf("%lld\n",sum);
else
printf("0\n");
}
return 0;
}