Problem 1566 - C - Spanning Tree

给出一个联通图,然后每次加一条边,每次需要求最小生成树

  1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 #include <string>
7 #include <vector>
8 #include <set>
9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF = 0x4fffffff;
17 const double EXP = 1e-5;
18 const int MS = 5005;
19 const int SIZE = 100005;
20
21 struct edge
22 {
23 int u,v,w;
24 bool operator <(const edge &a)const
25 {
26 return w<a.w;
27 }
28 }edges[SIZE];
29
30 int n,m,q,ans,cnt;
31
32 int fa[MS];
33
34 int find(int x)
35 {
36 int s;
37 for(s=x;fa[s]>=0;s=fa[s]);
38 while(s!=x)
39 {
40 int tmp=fa[x];
41 fa[x]=s;
42 x=tmp;
43 }
44 return s;
45 }
46
47 void merge(int u,int v)
48 {
49 int f1=find(u);
50 int f2=find(v);
51 int tmp=fa[f1]+fa[f2];
52 if(fa[f1]>fa[f2])
53 {
54 fa[f1]=f2;
55 fa[f2]=tmp;
56 }
57 else
58 {
59 fa[f2]=f1;
60 fa[f1]=tmp;
61 }
62 }
63
64
65 bool flag[MS];
66
67 int MST()
68 {
69 int num=0,sum=0;
70 sort(edges,edges+cnt);
71 memset(fa,0xff,sizeof(fa));
72 memset(flag,0,sizeof(flag));
73 for(int i=0;i<cnt;i++)
74 {
75 int u=edges[i].u;
76 int v=edges[i].v;
77 int w=edges[i].w;
78 if(find(u)!=find(v))
79 {
80 merge(u,v);
81 flag[i]=1;
82 sum+=w;
83 num++;
84 }
85 if(num>=n-1)
86 break;
87 }
88 num=0;
89 for(int i=0;i<cnt;i++)
90 if(flag[i])
91 edges[num++]=edges[i];
92 cnt=num;
93 return sum;
94 }
95
96 int main()
97 {
98 int u,v,w;
99 while(scanf("%d%d%d",&n,&m,&q)!=EOF)
100 {
101 cnt=0;
102 for(int i=0;i<m;i++)
103 {
104 scanf("%d%d%d",&u,&v,&w);
105 if(u==v)
106 continue;
107 edges[cnt].u=u;
108 edges[cnt].v=v;
109 edges[cnt++].w=w;
110 }
111 ans=MST();
112 for(int i=0;i<q;i++)
113 {
114 scanf("%d%d%d",&u,&v,&w);
115 if(u==v)
116 {
117 printf("%d\n",ans);
118 }
119 else
120 {
121 edges[cnt].u=u;
122 edges[cnt].v=v;
123 edges[cnt++].w=w;
124 ans=MST();
125 printf("%d\n",ans);
126 }
127 }
128 }
129 return 0;
130 }

Problem 1566 - C - Spanning Tree 动态最小生成树的更多相关文章

  1. 【HDU 4408】Minimum Spanning Tree(最小生成树计数)

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

  2. Geeks : Kruskal’s Minimum Spanning Tree Algorithm 最小生成树

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  3. 说说最小生成树(Minimum Spanning Tree)

    minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...

  4. HDU 4408 Minimum Spanning Tree 最小生成树计数

    Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  5. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  6. 数据结构与算法分析–Minimum Spanning Tree(最小生成树)

    给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...

  7. Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树+树链剖分+线段树

    E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...

  8. 【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解

    本节纲要 什么是图(network) 什么是最小生成树 (minimum spanning tree) 最小生成树的算法 什么是图(network)? 这里的图当然不是我们日常说的图片或者地图.通常情 ...

  9. Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA链上最大值

    E. Minimum spanning tree for each edge 题目连接: http://www.codeforces.com/contest/609/problem/E Descrip ...

随机推荐

  1. top,它们的意思分别是1分钟、5分钟、15分钟内系统的平均负荷。

    理解Linux系统负荷   作者: 阮一峰 日期: 2011年7月31日   一.查看系统负荷 如果你的电脑很慢,你或许想查看一下,它的工作量是否太大了. 在Linux系统中,我们一般使用uptime ...

  2. Debian 16.04 配置双网卡绑定bond

    Debian 16.04 配置双网卡绑定bond Debian 16.04 bonding多网卡配置 安装负载均衡软件 fenslave root@ubuntu:~# apt-get install ...

  3. Samba服务配置及配置文件说明

    前言 1.配置Samba服务为什么要关闭防火墙(firewalld)和Selinux? 在linux操作系统中默认开启了防火墙,Selinux也处于启动状态,一般状态为enforing:所以,在我们搭 ...

  4. Java 四种内置线程池

    引言 我们之前使用线程的时候都是使用 new Thread 来进行线程的创建,但是这样会有一些问题 每次 new Thread 新建对象性能差 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可 ...

  5. 大数据学习之路——MySQL基础(一)——MySQL的基础知识与常见操作

    一.存储引擎 1.含义 存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引 ...

  6. Mysql索引数据结构为什么是B+树?

    目录 Mysql索引数据结构 二叉树 红黑树 B-Tree B+Tree Mysql索引数据结构 下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树) Select * from ...

  7. Python+Selenium自动化-模拟键盘操作

    Python+Selenium自动化-模拟键盘操作   0.导入键盘类Keys() selenium中的Keys()类提供了大部分的键盘操作方法:通过send_keys()方法来模拟键盘上的按键. # ...

  8. GO学习-(5) Go语言基础之基本数据类型

    Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等.Go 语言的基本类型和其他语言大同小异. 基本数据类型 整型 整型 ...

  9. 立体显示与BCN双稳态手性向列相

    立体显示与BCN双稳态手性向列相 狭缝光栅立体显示 技术介绍: 人的左右眼间距大约是65MM,左右眼透过视差光栅看到不同的视角图像,经大脑融合形成立体视觉. 技术优点: 2D/3D可切换: 低成本: ...

  10. Nsight Compute Profilier 分析

    profiler报告包含每次内核启动分析期间收集的所有信息.在用户界面中,它包含一个包含常规信息的标题,以及用于在报告页面或单个收集的启动之间切换的控件.默认情况下,报告以选定的详细信息页面开始. 页 ...