COGS——T 1578. 次小生成树初级练习题

http://www.cogs.pro/cogs/problem/problem.php?pid=1578

☆   输入文件:mst2.in   输出文件:mst2.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

求严格次小生成树

【输入格式】

第一行包含两个整数N 和M,表示无向图的点数与边数。 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z。

【输出格式】

包含一行,仅一个数,表示严格次小生成树的边权和。(数据保证必定存在严格次小生成树)

【样例输入】

5 6

1 2 1

1 3 2

2 4 3

3 5 4

3 4 3

4 5 6

【样例输出】

11

【提示】

数据中无向图无自环; 50% 的数据N≤2 000 M≤3 000; 80% 的数据N≤50 000 M≤100 000; 100% 的数据N≤100 000 M≤300 000 ,边权值非负且不超过 10^9 。

【来源】

bzoj。。。

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <cstdio>
 4
 5 using namespace std;
 6
 7 const int INF(0x7fffffff);
 8 const int N(300005);
 9 struct Edge
10 {
11     int u,v,w;
12     bool operator < (const Edge &x) const
13     {
14         return w<x.w;
15     }
16 }edge[N];
17 int n,m,fa[N],used[N];
18
19 int find(int x)
20 {
21     return x==fa[x]?x:x=find(fa[x]);
22 }
23
24 inline int k(int cant)
25 {
26     int ret=0,cnt=0,fx,fy;
27     for(int i=1;i<=n;i++) fa[i]=i;
28     for(int i=1;i<=m;i++)
29     {
30         if(i==cant) continue;
31         fx=find(edge[i].u),fy=find(edge[i].v);
32         if(fa[fx]==fy) continue;
33         fa[fx]=fy;
34         ret+=edge[i].w;
35         if(++cnt==n-1) return ret;
36     }
37     return INF;
38 }
39
40 inline void read(int &x)
41 {
42     register char ch=getchar();x=0;
43     for(;ch>‘9‘||ch<‘0‘;) ch=getchar();
44     for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘;
45 }
46 int AC()
47 {
48     freopen("mst2.in","r",stdin);
49     freopen("mst2.out","w",stdout);
50
51     read(n),read(m);
52     for(int i=1;i<=m;i++)
53     {
54         read(edge[i].u);
55         read(edge[i].v);
56         read(edge[i].w);
57     }
58     sort(edge+1,edge+m+1);
59     int Fir_min=0,Sec_min=INF,tmp,cnt=0;
60     for(int i=1;i<=n;i++) fa[i]=i;
61     for(int fx,fy,i=1;i<=m;i++)
62     {
63         fx=find(edge[i].u);
64         fy=find(edge[i].v);
65         if(fa[fx]==fy) continue;
66         fa[fx]=fy;
67         Fir_min+=edge[i].w;
68         used[++cnt]=i;
69         if(cnt==n-1) break;
70     }
71     for(int i=1;i<=cnt;i++)
72     {
73         tmp=k(used[i]);
74         if(tmp>Fir_min&&tmp<Sec_min)
75             Sec_min=tmp;
76     }
77     printf("%d\n",Sec_min);
78     return 0;
79 }
80
81 int I_want_AC=AC();
82 int main(){;}
时间: 2024-08-10 15:12:03

COGS——T 1578. 次小生成树初级练习题的相关文章

cogs——1578. 次小生成树初级练习题

1578. 次小生成树初级练习题 ☆   输入文件:mst2.in   输出文件:mst2.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 求严格次小生成树 [输入格式] 第一行包含两个整数N 和M,表示无向图的点数与边数. 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z. [输出格式] 包含一行,仅一个数,表示严格次小生成树的边权和.(数据保证必定存在严格次小生成树) [样例输入] 5 6 1 2 1 1 3 2 2 4 3

COGS 1578. 次小生成树初级练习题

☆   输入文件:mst2.in   输出文件:mst2.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 求严格次小生成树 [输入格式] 第一行包含两个整数N 和M,表示无向图的点数与边数. 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z. [输出格式] 包含一行,仅一个数,表示严格次小生成树的边权和.(数据保证必定存在严格次小生成树) [样例输入] 5 6 1 2 1 1 3 2 2 4 3 3 5 4 3 4 3 4 5

cogs P1578【模板】 次小生成树初级练习题

1578. 次小生成树初级练习题 ☆   输入文件:mst2.in   输出文件:mst2.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 求严格次小生成树 [输入格式] 第一行包含两个整数N 和M,表示无向图的点数与边数. 接下来 M行,每行 3个数x y z 表示,点 x 和点y之间有一条边,边的权值为z. [输出格式] 包含一行,仅一个数,表示严格次小生成树的边权和.(数据保证必定存在严格次小生成树) [样例输入] 5 6 1 2 1 1 3 2 2 4 3

HDU4081 Qin Shi Huang&#39;s National Road System【Kruska】【次小生成树】

Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3979    Accepted Submission(s): 1372 Problem Description During the Warring States Period of ancient China(4

Ural 1416 Confidential,次小生成树

不严格次小生成树. 注意图可能不连通. #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int maxn = 505; const int INF = 1e7; bool vis[maxn]; int d[maxn]; int pre[maxn]; int Max[maxn][maxn]; int g[

TOJ--1278--最小生成树

今天中午做的 第一次用邻接表去实现... 我就写了下prim的 相比于kruskal 还是更喜欢它多一点... 虽然知道prim+heap优化 可是我写不来..... 对于 heap 虽然觉得它的概念很简单 但实现起来真的好伤啊.. 我想 对于prim的理解应该差不多了 基本上可以直接手码出来了 虽然这个很简单.... 以前原来就有一篇 prim的介绍 那我就懒的写了 直接上代码吧  一般都是用  邻接矩阵实现的.. #include <iostream> #include <cstri

次小生成树(SST)

次小生成树(SST) 题目背景 Awson是某国际学校信竞组的一只菜鸡.Awson最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当Awson洋洋得意之时,信竞组其他大佬又来泼Awson冷水了. 题目描述 他们说,让Awson求出一个无向图的次小生成树,而且这个次小生成树还得是严格次小的,也就是说: 如果最小生成树选择的边集是EM,严格次小生成树选择的边集是ES,那么需要满足:              (value(e) 表示边 e的权值)这下Awson蒙了,他

poj1679+次小生成树

Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undirected graph G = (V, E). A spanning tree of G is a subgraph of G, say T = (V', E'), with the followin

HDU4081 Qin Shi Huang&#39;s National Road System(次小生成树)

枚举作为magic road的边,然后求出A/B. A/B得在大概O(1)的时间复杂度求出,关键是B,B是包含magic road的最小生成树. 这么求得: 先在原图求MST,边总和记为s,顺便求出MST上任意两点路径上的最长边d[i][j]. 当(u,v)是magic road时, 如果它在原本的MST上,则B就等于s-原(u,v)的权,而原(u,v)的权其实就是d[u][v]: 如果它不在原本的MST上,则B就等于s-d[u][v]+0. 总之就是一个式子:B=s-d[u][v]. 于是,在