1395

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 #include<vector>
 5 #include<map>
 6 #include<set>
 7 #include<cstring>
 8 #include<cstdio>
 9 #include<cmath>
10 #include<cstdlib>
11 #include<stack>
12 #include<iomanip>
13 #include<cctype>
14 #include<climits>
15 #include<queue>
16 #define INF 10001
17 using namespace std;
18 typedef long long ll;
19 typedef unsigned long long ull;
20
21 const int maxn=5000;
22 int u[maxn],v[maxn],fa[maxn],r[maxn],w[maxn];
23
24 int find(int x)
25 {
26     return fa[x]==x?x:fa[x]=find(fa[x]);
27 }
28
29 int cmp(int i,int j)
30 {
31     return w[i]<w[j];
32 }
33
34 void Kruskal(int m,int n)
35 {
36     int ans=INF;
37     for(int i=1;i<=m;i++)
38         r[i]=i;
39     sort(r+1,r+m+1,cmp);
40     for(int i=1;i<=m;i++){
41         for(int j=1;j<=n;j++)
42             fa[j]=j;
43         int node=0,temp=0;
44         for(int k=i;k<=m;k++){
45             int e=r[k];
46             int x=find(u[e]);
47             int y=find(v[e]);
48             if(x!=y){
49                 fa[x]=y;
50                 node++;
51                 if(node==n-1){//题目已经说明G是一个连通图,所以当所有节点都访问到时,说明走成了一条通路,于是可以计算这条通路的苗条度。
52                     temp=w[r[k]]-w[r[i]];
53                     ans=min(ans,temp);
54                     break;
55                 }
56             }
57         }
58     }
59     if(ans!=INF)
60         printf("%d\n",ans);
61     else
62         printf("-1\n");
63 }
64
65
66 int main()
67 {
68     int m,n;
69     while(~scanf("%d %d",&n,&m)){
70         if(n==0&&m==0)
71             return 0;
72         for(int i=1;i<=m;i++)
73             scanf("%d%d%d",&u[i],&v[i],&w[i]);
74         Kruskal(m,n);
75     }
76     return 0;
77 }
时间: 2024-08-06 07:56:56

1395的相关文章

[2016-01-27][UVA][1395][D -?Slim Span]

[2016-01-27][UVA][1395][D - Slim Span] 时间:2016-01-21  11:06:30  星期四 题目编号:UVA 1395 题目大意:求所有生成树 最大边和最小边之差的最小值 分析: 想法是枚举所有边,但是分析之后发现可以不用枚举所有的树 已知krukal得到的最小生成树得到的最小生成树,最大边最小 也就是说,这个最大边,就是使得 最大边和最小边 差值最大的边 那么,只需要求每条边的对应的差值最小的最大边即可 方法: 从最小的边开始跑生成树,然后跑krus

hdu 1395 2^x mod n = 1 (简单数论)

题目大意: 求出一个最小的x 使得 2的x次方对n取模为1 思路分析: 若要 a*b%p=1  要使得b存在 则 gcd (a,p)=1. 那么我们应用到这个题目上来. 当n为偶数 2^x 也是偶数,那么gcd 肯定不是1.故这个是不存在的. 那么n为奇数的时候,也就一定是1了. 所以直接暴力找. #include <iostream> #include <cstdio> using namespace std; int main() { int n; while(scanf(&q

hdoj 1395 2^x mod n = 1 【暴力】

策略 : 观察可知,1 或者是能被2整除的数都不会求余等于1, 仅仅须要推断一下是不是除1之外的奇数,在依次查找2^x(mod(n)) ? = 1就能够了 难点:假设每次都是在原来的基础上×2 再推断 会超时.这时候,要用一下同余定理就能够了 AC by SWS; 题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1395 代码: #include<stdio.h> int main() { int n; while(scanf("%d&

hdu 1395 2^x mod n = 1(暴力题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1395 2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12146    Accepted Submission(s): 3797 Problem Description Give a number n, find

HDU 1395 2^x mod n = 1

/* 中文题意: 中文翻译: 题目大意:求出最小的 n 使得2的 I 次方对 n 的值为1. 解题思路:如下: 难点详解:先用费马小定理了解2的 i 次方对偶数取余都不可能是一,还有就是排除 1 .之后要用中国剩余定理让 t 的值不超出 int 范围.不用这个定理我错了n次,都是超时.我猜测可能是 t 的值超出了int 的范围了,之后的数都是随机的,所以一直运行不出来,才会超时的.(不知道我的猜测对不对,欢迎大家指正) 关键点:理解费马小定理(我到现在还是不理解),只是用到了一点点这个东西.还有

UVA 1395 - Slim Span(MST)

UVA 1395 - Slim Span 题目链接 题意:给定一些结点和边,要求出最苗条度最小的生成树,苗条度定义为:生成树中最大权的边减去最小权的边的值 思路:类似建最小生成树的算法,多一步枚举起始边即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; const int INF = 0x3f3f3f3f; int

杭电 1395

2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11658    Accepted Submission(s): 3634 Problem Description Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1. In

UVa 1395 苗条的生成树(Kruskal+并查集)

https://vjudge.net/problem/UVA-1395 题意: 给出一个n结点的图,求苗条度(最大边减最小边的值)尽量小的生成树. 思路: 主要还是克鲁斯卡尔算法,先仍是按权值排序,对于一个连续的边集区间[L,R],如果这些边使得n个点全部连通,则一定存在一个苗条度不超过W[R]-W[L]的生成树.从小到大枚举L,对于每个L,从小到大枚举R. 这道题目我一直超时,最后发现数组开小了,我一直以为数组开小了肯定会出来Runtime error的... 1 #include<iostr

【UVA 1395】 Slim Span (苗条树)

[题意] 求一颗生成树,满足最大边和最小边之差最小 InputThe input consists of multiple datasets, followed by a line containing two zeros separated by a space.Each dataset has the following format.n ma1 b1 w1...am bm wmEvery input item in a dataset is a non-negative integer.

UVa 1395 (最小生成树)

题目链接:http://vjudge.net/problem/41567/origin 本来想着m^2的复杂度撑不住,对于这种擦着边的复杂度就好慌. 首先对所有的边排个序,然后枚举每个可以构成生成树的区间(L,R),取区间里面构成树的边的权值的最小和最大的差值,求最小值即可. 如果已经构成生成树可以break掉优化下. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include &l