UVa 11631 - Dark roads
2014-03-22 20:24
681 查看
题目:求一个图中,形成最小生成树后剩下的边长的总和,即利用补图求kruskal求SMT删掉的边的长度和。
分析:图论,最小生成树。
分析:图论,最小生成树。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; typedef struct d_node { int point1; int point2; int weight; }enode; enode edge[200002]; //union_set int sets[200002]; int rank[200002]; void set_inital( int a, int b ) { for ( int i = a ; i <= b ; ++ i ) { rank[i] = 0; sets[i] = i; } } int set_find( int a ) { if ( a != sets[a] ) sets[a] = set_find( sets[a] ); return sets[a]; } void set_union( int a, int b ) { if ( rank[a] < rank[b] ) sets[a] = b; else { if ( rank[a] == rank[b] ) rank[a] ++; sets[b] = a; } } //end_union_set int cmp_e( enode a, enode b ) { return a.weight < b.weight; } long long kruskal( int n, int m ) { sort( edge, edge+m, cmp_e ); set_inital( 0, n ); long long sum = 0LL; for ( int i = 0 ; i < m ; ++ i ) { int A = set_find( edge[i].point1 ); int B = set_find( edge[i].point2 ); if ( A != B ) { set_union( A, B ); sum += edge[i].weight+0LL; } } return sum; } int main() { int n,m,a,b,c; while ( scanf("%d%d",&n,&m) && n+m ) { long long sum = 0LL; for ( int i = 0 ; i < m ; ++ i ) { scanf("%d%d%d",&a,&b,&c); edge[i].point1 = a; edge[i].point2 = b; edge[i].weight = c; sum += c+0LL; } printf("%lld\n",sum-kruskal( n, m ) ); } return 0; }
相关文章推荐
- Uva-11631- Dark roads
- Uva 11631 - Dark roads
- UVa11631 Dark Roads(最小生成树,邻接表)
- uva11631 - Dark roads
- UVa 11631 - Dark roads
- UVA11631
- 【Sorting】UVa400 Unix ls
- uvalive 3401 poj 2741 Colored Cubes
- UVA 10516 - Another Counting Problem(递推)
- Uva 11525 Permutation
- UVa869 - Airline Comparison(并查集)
- uva 539 The Settlers of Catan(回溯)
- UVa - 129 - Krypton Factor
- uva573
- uva1603
- UVA 11261 - Bishops(杂题)
- UVa 10267 - Graphical Editor
- UVALive - 7501 思维 +二分
- uva 10048 Audiophobia
- UVA 10391 Compound Words