标签:
Network
Time Limit: 1000MS
Memory Limit: 30000K | ||||
Total Submissions: 16047 | Accepted: 6362 | Special Judge |
Description
Input
Output
Sample Input
4 6 1 2 1 1 3 1 1 4 2 2 3 1 3 4 1 2 4 1
Sample Output
1 4 1 2 1 3 2 3 3 4
【分析】首先,这一题有问题。第一,输入文件包含多个测试用据,他没说;第二,测试用例的结果错了,应该是
1
3
1 2
1 3
3 4
而且应该是多判的,可以用Kruskal;
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include<functional> #define mod 1000000007 #define inf 0x3f3f3f3f #define pi acos(-1.0) using namespace std; typedef long long ll; const int N=1005; const int M=15005; vector<int>q; struct Edg { int v,u; int w; } edg[M]; bool cmp(Edg g,Edg h) { return g.w<h.w; } int n,m,k,maxn; int parent[N]; void init() { for(int i=0; i<n; i++)parent[i]=i; } void Build() { int u,v,w; for(int i=0; i<m; i++) { scanf("%d%d%d",&u,&v,&w); edg[i].u=u; edg[i].v=v; edg[i].w=w; } sort(edg,edg+m,cmp); } int Find(int x) { if(parent[x] != x) parent[x] = Find(parent[x]); return parent[x]; }//查找并返回节点x所属集合的根节点 void Union(int x,int y) { x = Find(x); y = Find(y); if(x == y) return; parent[y] = x; }//将两个不同集合的元素进行合并 void Kruskal() { int sum=0; int num=0; int u,v; for(int i=0; i<m; i++) { u=edg[i].u; v=edg[i].v; if(Find(u)!=Find(v)) { sum+=edg[i].w; maxn=max(maxn,edg[i].w); q.push_back(i); num++; Union(u,v); } if(num>=n-1) { printf("%d\n%d\n",maxn,n-1); break; } } } int main() { while(~scanf("%d%d",&n,&m)) { while(!q.empty())q.pop_back(); maxn=-1; init(); Build(); Kruskal(); for(int i=0; i<q.size(); i++) { int l=q[i]; printf("%d %d\n",edg[l].u,edg[l].v); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/jianrenfang/p/5728798.html