【图论补完计划】poj 3522 (最小生成树)

Slim Span

Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 7933   Accepted: 4227

Description

Given an undirected weighted graph G, you should find one of spanning trees specified as follows.

The graph G is an ordered pair (V, E), where V is a set of vertices {v1, v2, …, vn} and E is a set of undirected edges {e1, e2, …, em}. Each edge eE has its weight w(e).

A spanning tree T is a tree (a connected subgraph without cycles) which connects all the n vertices with n ? 1 edges. The slimness of a spanning tree T is defined as the difference between the largest weight and the smallest weight among the n ? 1 edges of T.


Figure 5: A graph G and the weights of the edges

For example, a graph G in Figure 5(a) has four vertices {v1, v2, v3, v4} and five undirected edges {e1, e2, e3, e4, e5}. The weights of the edges are w(e1) = 3, w(e2) = 5, w(e3) = 6, w(e4) = 6, w(e5) = 7 as shown in Figure 5(b).


Figure 6: Examples of the spanning trees of G

There are several spanning trees for G. Four of them are depicted in Figure 6(a)~(d). The spanning tree Ta
in Figure 6(a) has three edges whose weights are 3, 6 and 7. The
largest weight is 7 and the smallest weight is 3 so that the slimness of
the tree Ta is 4. The slimnesses of spanning trees Tb, Tc and Td
shown in Figure 6(b), (c) and (d) are 3, 2 and 1, respectively. You can
easily see the slimness of any other spanning tree is greater than or
equal to 1, thus the spanning tree Td in Figure 6(d) is one of the
slimmest spanning trees whose slimness is 1.

Your job is to write a program that computes the smallest slimness.

Input

The
input consists of multiple datasets, followed by a line containing two
zeros separated by a space. Each dataset has the following format.

n m  
a1 b1 w1
  ?  
am bm wm

Every
input item in a dataset is a non-negative integer. Items in a line are
separated by a space. n is the number of the vertices and m the number
of the edges. You can assume 2 ≤ n ≤ 100 and 0 ≤ mn(n ? 1)/2. ak and bk (k = 1, …, m) are positive integers less than or equal to n, which represent the two vertices vak and vbk connected by the kth edge ek. wk is a positive integer less than or equal to 10000, which indicates the weight of ek. You can assume that the graph G = (V, E)
is simple, that is, there are no self-loops (that connect the same
vertex) nor parallel edges (that are two or more edges whose both ends
are the same two vertices).

Output

For
each dataset, if the graph has spanning trees, the smallest slimness
among them should be printed. Otherwise, ?1 should be printed. An output
should not contain extra characters.

Sample Input

4 5
1 2 3
1 3 5
1 4 6
2 4 6
3 4 7
4 6
1 2 10
1 3 100
1 4 90
2 3 20
2 4 80
3 4 40
2 1
1 2 1
3 0
3 1
1 2 1
3 3
1 2 2
2 3 5
1 3 6
5 10
1 2 110
1 3 120
1 4 130
1 5 120
2 3 110
2 4 120
2 5 130
3 4 120
3 5 110
4 5 120
5 10
1 2 9384
1 3 887
1 4 2778
1 5 6916
2 3 7794
2 4 8336
2 5 5387
3 4 493
3 5 6650
4 5 1422
5 8
1 2 1
2 3 100
3 4 100
4 5 100
1 5 50
2 5 50
3 5 50
4 1 150
0 0

Sample Output

1
20
0
-1
-1
1
0
1686
50
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5
 6 using namespace std;
 7
 8 const int maxn=105;
 9 const int maxm=10005;
10 const int inf=1e9;
11
12 int par[maxn],Rank[maxn];
13
14 int n,m;
15
16 void init(){
17     for(int i=1;i<=n;i++){
18         par[i]=i;
19         Rank[i]=0;
20     }
21 }
22
23 int Find(int x){
24     if(x==par[x]) return x;
25     return par[x]=Find(par[x]);
26 }
27
28 void unite(int x,int y){
29     x=Find(x);
30     y=Find(y);
31     if(x==y) return;
32     if(Rank[x]<Rank[y]){
33         par[x]=y;
34     }
35     else{
36         par[y]=x;
37         if(Rank[x]==Rank[y]) Rank[x]++;
38     }
39 }
40
41 bool same(int x,int y){
42     return Find(x)==Find(y);
43 }
44
45 struct edge{
46     int s,t,v;
47 }E[maxm];
48
49 int ne;
50
51 int cmp(const edge&a,const edge&b){
52     return a.v<b.v;
53 }
54
55 void add_edge(int s,int t,int v){
56     E[ne].s=s;
57     E[ne].t=t;
58     E[ne++].v=v;
59 }
60
61 int kruskal(int s){
62     int mxe=-1;
63     int tot=0;
64     for(int i=s;i<ne;i++){
65         edge &e=E[i];
66         if(!same(e.s,e.t)){
67             unite(e.s,e.t);
68             tot++;
69             mxe=e.v;
70         }
71     }
72     if(tot!=n-1) return -1;
73     return mxe-E[s].v;
74 }
75
76 int main(){
77     while(scanf("%d %d",&n,&m)==2&&n){
78         ne=0;
79         for(int i=0;i<m;i++){
80             int s,t,v;
81             scanf("%d %d %d",&s,&t,&v);
82             add_edge(s,t,v);
83             add_edge(t,s,v);
84         }
85         sort(E,E+ne,cmp);
86         int res=inf;
87         for(int i=0;i<ne;i++){
88             init();
89             int tmp=kruskal(i);
90             if(tmp!=-1) res=min(res,tmp);
91         }
92         if(res==inf) printf("-1\n",res);
93         else printf("%d\n",res);
94     }
95     return 0;
96 }
时间: 2024-08-26 02:35:46

【图论补完计划】poj 3522 (最小生成树)的相关文章

【图论补完计划】poj 3463 (次短路计数 dijkstra)

Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9127   Accepted: 3206 Description Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the bus moves from one city S to another city F. O

【图论补完计划】poj 2723(2-SAT)

Get Luffy Out Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8688   Accepted: 3371 Description Ratish is a young man who always dreams of being a hero. One day his friend Luffy was caught by Pirate Arlong. Ratish set off at once to Arlo

【图论补完计划】poj 3635 (最短路变形)

Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7427   Accepted: 2399 Description After going through the receipts from your car trip through Europe this summer, you realised that the gas prices varied between the cities you v

哈萨比斯的人类补完计划

在著名动漫<新世纪福音战士>里,碇源堂和他背后的SEELE组织始终在执行一项叫做"人类补完计划"的神秘行动. 这个计划到底是什么意思,粉丝们已经争吵了很多年.但大体上应该是说利用"神性"来补完人类族群,从而消除人类社会中的种种问题.也就是说,这个计划是"把人类补完的计划". 但"人类补完"这个词,其实还可以有另一种解释,就是"用人类去补完某种东西的计划".有东西需要用人类来补完吗?当然有,比如说

POJ1742 Coin [DP补完计划]

题目传送门 Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 41707   Accepted: 14125 Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony opened his money-box and found there wer

CodeVS1169 传纸条 [DP补完计划]

题目传送门 题目描述 Description 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递. 在活动进行中,小渊希望给小轩传递一

图论常用算法之一 POJ图论题集【转载】

POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:http://poj.org/ 1062* 昂贵的聘礼 枚举等级限制+dijkstra 1087* A Plug for UNIX 2分匹配 1094 Sorting It All Out floyd 或 拓扑 1112* Team Them Up! 2分图染色+DP 1125 Stockbroker

专题补全计划

专题补全计划 概述 时间: 寒假+大三下学期 要求: 1.每一类型的专题都要有专门的总结贴,有新的体会应该去更新总结贴. 2.大量做题和总结,及时复习,整理模板. 3.适当与外界交流,必要时需要完善训练计划. 4.持之以恒! 模板链接:(待完善) https://github.com/Wowkiee/ACM-ICPC/tree/master/template 知识点(待完善) 数据结构 ST表 线段树 主席树 动态规划 动态规划 区间dp 图论 最短路 最小生成树 网络流 联通分量 数学 pol

补番计划 (长沙理工大学第十一届程序设计竞赛)(双端队列+set容器+string)

补番计划 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 8   Accepted Submission(s) : 1 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 阿聪是一个日漫狂魔.暑假在家的时候,他有12小时在补番,12小时在睡