poj 1287 Networking
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 6000 | Accepted: 3242 |
Description
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 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
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
题意:一个网络中有n个结点,给出m对结点间的连接距离,现在求出一条连接所有结点的最短路径。
思路:最小生成树(Kruskal算法)
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; #define M 10000 int f[M]; int sum; struct node { int x,y,l; }p[M]; bool cmp(node a,node b) { return (a.l<b.l); } void Init (int n) { for(int i=1;i<=n;i++) f[i]=i; } int find(int x) { if(x!=f[x]) return f[x]=find(f[x]); return f[x]; } int Kruskal(int x,int y,int z) { int fx=find(x); int fy=find(y); if(fx!=fy) { f[fy]=fx; sum+=z; } return sum; } int main () { int n,m; int i; while(cin>>n&& n) { cin>>m; for(i=0;i<m;i++) cin>>p[i].x>>p[i].y>>p[i].l; sort(p,p+m,cmp); Init(n); sum=0; for(i=0;i<m;i++) Kruskal(p[i].x,p[i].y,p[i].l); cout<<sum<<endl; } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。