Networking
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 1 Accepted Submission(s) : 1
Your task is to design the network for the area, so that there is a connection (direct or indirect) between every two points (i.e., all the points are interconnected, but not necessarily by a direct cable), and that the total length of the used cable is minimal.
Input
The input file consists of a number of data sets. Each data set defines one required network. The first line of the set contains two integers: the first defines the number P of the given points, and the second the number R of given routes between the points. The following R lines define the given routes between the points, each giving three integer numbers: the first two numbers identify the points, and the third gives the length of the route. The numbers are separated with white spaces. A data set giving only one number P=0 denotes the end of the input. The data sets are separated with an empty line.
The maximal number of points is 50. The maximal length of a given route is 100. The number of possible routes is unlimited. The nodes are identified with integers between 1 and P (inclusive). The routes between two points i and j may be given as i j or as j i.
Output
For each data set, print one number on a separate line that gives the total length of the cable used for the entire designed network.
Sample Input
1 0
2 3
1 2 37
2 1 17
1 2 68
3 7
1 2 19
2 3 11
3 1 7
1 3 5
2 3 89
3 1 91
1 2 32
5 7
1 2 5
2 3 7
2 4 8
4 5 11
3 5 10
1 5 6
4 2 12
0
Sample Output
0
17
16
26
最小生成树的模板题,这一类题有很多,主要是让记模板的,为以后做打算,这类题,代码几乎一模一样,我做了好几道了全部都是52行代码。以后会越敲越快,秒写52行无bug。
克鲁斯卡尔。
附ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int start;
int end;
int cost;
}t[10010];
int cmp(node a,node b)
{
return a.cost <b.cost ;
}
int per[110];
int find(int x)
{
int r=x;
while(r!=per[r])
r=per[r];
return r;
}
int join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
per[fx]=fy;
return 1;
}
return 0;
}
int main()
{
int i,n,m;
while(scanf("%d",&n),n)
{
for(i=0;i<110;i++)
per[i]=i;
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d%d%d",&t[i].start,&t[i].end,&t[i].cost);
sort(t,t+m,cmp);
int sum=0;
for(i=0;i<m;i++)
if(join(t[i].start,t[i].end))
sum=sum+t[i].cost;
printf("%d\n",sum);
}
return 0;
}