(beginer) 最小生成树 UVA 11747 Heavy Cycle Edges
2014-02-08 09:55
302 查看
Problem F: Heavy Cycle Edges
Given an undirected graph with edge weights, a minimum spanning tree is a
subset of edges of minimum total weight such that any two nodes are connected by
some path containing only these edges. A popular algorithm for finding the
minimum spanning tree T in a graph proceeds as follows:
let T be initially empty
consider the edges e1, ..., em in increasing order of
weight
add ei to T if the endpoints of ei are not connected
by a path in T
An alternative algorithm is the following:
let T be initially the set of all edges
while there is some cycle C in T
remove edge e from T where e has the heaviest weight in C
Your task is to implement a function related to this algorithm. Given an
undirected graph G with edge weights, your task is to output all edges that are
the heaviest edge in some cycle of G.
Input Format
The first input of each case begins with integers n and m with 1 ≤ n ≤ 1,000and 0 ≤ m ≤ 25,000 where n is the number of nodes and m is the number of edges
in the graph. Following this are m lines containing three integers u, v, and w
describing a weight w edge connecting nodes u and v where 0 ≤ u, v < n and 0
≤ w < 231. Input is terminated with a line containing n = m = 0;
this case should not be processed. You may assume no two edges have the same
weight and no two nodes are directly connected by more than one edge.
Output Format
Output for an input case consists of a single line containing the weights ofall edges that are the heaviest edge in some cycle of the input graph. These
weights should appear in increasing order and consecutive weights should be
separated by a space. If there are no cycles in the graph then output the text
forestinstead of numbers.
Sample Input
3 3 0 1 1 1 2 2 2 0 3 4 5 0 1 1 1 2 2 2 3 3 3 1 4 0 2 0 3 1 0 1 1 0 0
Sample Output
3 2 4 forest
题意:把找最小生成树的步骤改成是删除环中最大的边。输出边的长度。
思路:其实和一开始是空的然后加边是一样的,因为我们在加边的时候就要判断会不会形成环,那么我们照样用kruskal算法,然后如果加边会形成环就把他输出就行了。
代码:
#include<iostream> #include<stdio.h> #include<string.h> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1010; const int maxm = 25010; int n , m; int p[maxn]; int find(int x) { if (x==p[x]) return x; return p[x] = find(p[x]); } struct Edge { Edge() { } Edge(int uu,int vv,int ww) :u(uu) , v(vv) , w(ww) { } int u , v , w; }edge[maxm]; inline bool operator<(const Edge&e1,const Edge&e2) { return e1.w < e2.w; } void input() { for (int i = 0 ; i < m ; ++i) { int u , v , w; scanf("%d%d%d",&u,&v,&w); edge[i] = Edge(u,v,w); } sort(edge,edge+m); } void solve() { bool flag = true; for (int i = 0 ; i < n ; ++i) p[i] = i; for (int i = 0 ; i < m ; ++i) { int u = find(edge[i].u); int v = find(edge[i].v); if (u==v) { if (flag) printf("%d",edge[i].w); else printf(" %d",edge[i].w); flag = false; continue; } p[u] = v; } if (flag) printf("forest"); cout << endl; } int main() { while (scanf("%d%d",&n,&m)==2,n+m) { input(); solve(); } }
相关文章推荐
- UVa 11747 Heavy Cycle Edges(最小生成树)
- uva 11747 - Heavy Cycle Edges(生成树)
- UVA-11747 - Heavy Cycle Edges(Kruskal)
- UVa 11747 - Heavy Cycle Edges
- UVA 11747 - Heavy Cycle Edges(MST)
- UVa 11747 - Heavy Cycle Edges
- uva 11747 Heavy Cycle Edges
- UVA 11747 Heavy Cycle Edges(MST)
- UVa11747 Heavy Cycle Edge (Kruskal)
- (beginer) 最小生成树 UVA 1395 Slim Span
- (beginer) 最小生成树 UVA 10600 ACM Contest and Blackout
- (beginer) 最小生成树 UVA 544 Heavy Cargo
- UVa 1395 Slim Span (最小生成树)
- 最小生成树(星际游击队,uva 1279)
- UVA 1151 - Buy or Build(最小生成树,二进制子集生成)
- UVa - 10369 - Arctic Network ( 最小生成树 Kruscal )
- uva 1151最小生成树
- UVA 1395 Slim Span (最小生成树,MST,kruscal)
- UVA-1494 - Qin Shi Huang's National Road System(最小生成树)
- UVA 10369- Arctic Network(最小生成树)