Spanning Tree with One Fixed Degree
https://codeforces.com/contest/1133/problem/F2
题解:先把与1无关的点合并,然后找与一相关必须连接的边,对于答案树想连必须的边,再连其他一相关边,最后连其他边
C++版本一
/*
*@Author: STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=200000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,q;
int ans,cnt,flag,temp,sum,u,v,d;
int a[N];
int pre[N];
int preans[N];
int vis[N];
bool broken[N];
char str;
vector<int>G[N];
struct Node{int u,v;bool operator <(const Node&S)const{if(u==S.u)return v<S.v;return u<S.u;}
}x;
vector <Node>ANS;
int find(int x){return (pre[x]==x)?x:pre[x]=find(pre[x]);}
int findans(int x){return (preans[x]==x)?x:preans[x]=findans(preans[x]);}
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);//while(t--){scanf("%d%d%d",&n,&m,&d);for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);}if((int)G[1].size()<d){cout<<"NO"<<endl;return 0;}for(int i=1;i<=n;i++){pre[i]=i;preans[i]=i;}for(int i=2;i<=n;i++){for(int j=0,k=G[i].size();j<k;j++){u=i;v=G[i][j];if(v==1)continue;int tx=find(u);int ty=find(v);if(tx!=ty){pre[tx]=ty;}}}for(int i=0,j=G[1].size();i<j;i++){u=1;v=G[1][i];int tx=find(u);int ty=find(v);if(tx!=ty){pre[tx]=ty;//cout<<u<<" "<<v<<endl;x.u=u;x.v=v;int ta=findans(u);int tb=findans(v);preans[ta]=tb;ANS.push_back(x);if(++cnt>=d)break;}}for(int i=0,j=G[1].size();i<j;i++){u=1;v=G[1][i];int ta=findans(u);int tb=findans(v);if(cnt>=d)break;if(ta!=tb){//cout<<u<<" "<<v<<endl;cnt++;x.u=u;x.v=v;preans[ta]=tb;ANS.push_back(x);}}for(int i=2;i<=n;i++){for(int j=0,k=G[i].size();j<k;j++){u=i;v=G[i][j];if(v==1)continue;int ta=findans(u);int tb=findans(v);if(ta!=tb){//cout<<u<<" "<<v<<endl;x.u=u;x.v=v;preans[ta]=tb;ANS.push_back(x);}}}flag=0;for(int i=1;i<=n;i++){if(pre[i]==i){flag++;}}if(flag>1){cout<<"NO"<<endl;}else{cout<<"YES"<<endl;sort(ANS.begin(),ANS.end());for(int i=0,j=ANS.size();i<j;i++){x=ANS[i];cout<<x.u<<" "<<x.v<<endl;}}//}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}
C++版本二
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX_N=2e5+10;
int par[MAX_N]; //父亲
int ranks[MAX_N]; //树的高度
struct Edge{int u,v;};
Edge edges[MAX_N];
int cnt[MAX_N]={0,};
int n,m,k;
int ans[MAX_N],q=0;
void init(){for(int i=1;i<=n;i++){par[i]=i;ranks[i]=0;}
}int findit(int x){if(par[x]==x)return x;elsereturn par[x]=findit(par[x]);
}void unite(int x, int y){x=findit(x);y=findit(y);if(x==y) return;if(ranks[x]<ranks[y])par[x]=y;else par[y]=x;if(ranks[x]==ranks[y])ranks[x]++;
}bool same(int x, int y){return findit(x)==findit(y);
}int main(void){scanf("%d %d %d",&n,&m,&k);init();for(int i=0;i<m;++i){scanf("%d %d",&edges[i].u,&edges[i].v);cnt[edges[i].u]++;cnt[edges[i].v]++;}if(cnt[1]<k){printf("NO\n");return 0;}//先把剩下的点连起来for(int i=0;i<m;++i)if(edges[i].u!=1&&edges[i].v!=1)if(!same(edges[i].u,edges[i].v))unite(edges[i].u,edges[i].v);//得到顶点1必须选用的边for(int i=0;i<m;++i){if(edges[i].u==1||edges[i].v==1){if(!same(edges[i].u,edges[i].v)){unite(edges[i].u,edges[i].v);ans[q++]=i;}}}if(q>k){printf("NO\n");return 0;}//重新初始化init();printf("YES\n");for(int i=0;i<q;++i){unite(edges[ans[i]].u,edges[ans[i]].v);printf("%d %d\n",edges[ans[i]].u,edges[ans[i]].v);}for(int i=0;i<m&&q<k;++i){if(edges[i].u==1||edges[i].v==1){if(!same(edges[i].u,edges[i].v)){unite(edges[i].u,edges[i].v);printf("%d %d\n",edges[i].u,edges[i].v);q++;}}}//再连其他点for(int i=0;i<m;++i){if(edges[i].u!=1&&edges[i].v!=1){if(!same(edges[i].u,edges[i].v)){unite(edges[i].u,edges[i].v);printf("%d %d\n",edges[i].u,edges[i].v);}}}
}
Spanning Tree with One Fixed Degree相关推荐
- 【Codeforces Round #544 (Div. 3) F2. Spanning Tree with One Fixed Degree】DFS
F2. Spanning Tree with One Fixed Degree 题意 给你nnn个点mmm条边的无向联通图,找出一棵生成树,使111这个点的度=d=d=d. 1≤n,m≤1051 \l ...
- 2021ICPC(澳门) - LCS Spanning Tree(广义后缀自动机)
题目链接:点击查看 题目大意:给出一个含有 nnn 个点的无向图,点权为一个字符串,每条边的边权为相邻两点的 LCSLCSLCS,本题的 LCSLCSLCS 定义为两个字符串的最长公共子串的长度 求出 ...
- 2019ICPC(上海) - Spanning Tree Removal(构造)
题目链接:点击查看 题目大意:给出一个 nnn 个点的无向完全图,每次操作可以删掉包含 nnn 个点的一棵生成树中的所有边,问最多可以删几次 题目分析:典中典之欧拉通路构造题,构造方式如下: 在选定某 ...
- Minimum spanning tree HDU - 6954
Minimum spanning tree HDU - 6954 题意: 给定n-1个点,编号从2到n,两点a和b之间的边权重为lcm(a,b).请找出它们形成的最小生成树. 2<=n<= ...
- Spanning Tree Protocol介绍
Spanning Tree Protocol(STP)主要是用在网桥上,用来避免网络回路,并制造冗余连接(也就是保证网络的可靠性). 这里只是一个大概的介绍,具体的还是要去看IEEE 的 802.1D ...
- Directed Minimum Spanning Tree: Chu-Liu/Edmonds Algorithm
我们的现代数据库大作业要求实现一个图查询系统,包括基于属性的子图查询.可达性查询(可选).最短路径查询(可选).TopK最短路径查询(可选).图形化展示(可选)等功能.分成子图同构查询小组以及可达性及 ...
- 《Boost》Part1 Minimum Spanning Tree
<Boost>Part1 Minimum Spanning Tree 1.Boost中的最小生成树介绍 MST最小生成树,是图论中的基本算法,还有一种是最大生成树,此处暂不介绍. 最小生成 ...
- 数据结构与算法笔记:贪心策略之BSTBBST, Hashtable+Dictionary+Map, Priority Queue~Heap, Minium Spanning Tree
BST & BBST BST(Binary Search Tree) 二叉搜索树,也就是使用二叉树来做查找 BBST(Balanced Binary Search Tree) 平衡二叉搜索树 ...
- 计算机网络之STP(Spanning Tree Protocol)生成树协议详解及其实验配置
目录 1.STP概念 1.1 STP选举过程 1.1.1 根桥和根端口的选举 1.1.2 端口角色的选举 2.STP端口状态解释及转换 2.1 STP的五种端口状态 2.2 STP过程中的两种常见问 ...
最新文章
- 射极跟随器实验报告数据处理_射极跟随器实验报告模式
- 安全与透明:智能互联网的基石
- “万维网之父”发文阐述其下一个网络时代:将数据与应用分离,互联网去中心化正在路上...
- 【QA】Xcodeproj doesn't know about the following xxx 问题及解决方案
- .NET Core开发日志——配置
- 个人计算机使用的标准键盘,计算机键盘的基本用法!
- SpringMVC 、Struts的区别
- 卷积神经网络CNN是靠什么线索学习到深度信息的?
- MSSQL 触发器 暂停 和 启动
- Windows 各平台远程桌面客户端
- 2021年山东省职业院校技能大赛中职组”网络安全“正式赛题
- 自动控制原理->控制系统性能
- 【MM VS价】移动平均价V标准价格S(一)
- http的长连接和短连接(史上最通俗!)以及应用场景
- 嵌入式Linux系统开发入门宝典(第2版)
- php 实现抽奖接口,PHP转盘抽奖接口实例
- 概率论(三)- 全概公式逆概公式(贝叶斯公式)
- IE 下JS上传文件时出现“拒绝访问”的解决方案
- 【Android Gradle 插件】AaptOptions 配置 ② ( additionalParameters 附加参数配置 | --rename-manifest-package 配置 )
- C#中常用控件及其属性的用法
热门文章
- 操作无法完成_注意!城里人开始羡慕农村户口啦!4种情况却无法完成分户操作!...
- 基于物化视图优化_CVPR2017|基于构造多视图子空间中的潜在表示解决聚类问题
- 拖链电缆 机器人电缆_trvv高柔性拖链电缆
- maven打包jar单独配置log4j.properites文件记录日志
- 如何复制java卡,使用java做一个简单的集卡程序
- mysql数据库blob换行_mysql Blob存取的一个简单例子
- python pandas dataframe 转json_python-将嵌套的json转换为pandas dataframe
- 苹果手机还原网络设置会怎样_装维技巧|手机能连wifi但网不通?
- django view
- 十三、欧拉离散化计算期权定价期权定价