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相关推荐

  1. 【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 ...

  2. 2021ICPC(澳门) - LCS Spanning Tree(广义后缀自动机)

    题目链接:点击查看 题目大意:给出一个含有 nnn 个点的无向图,点权为一个字符串,每条边的边权为相邻两点的 LCSLCSLCS,本题的 LCSLCSLCS 定义为两个字符串的最长公共子串的长度 求出 ...

  3. 2019ICPC(上海) - Spanning Tree Removal(构造)

    题目链接:点击查看 题目大意:给出一个 nnn 个点的无向完全图,每次操作可以删掉包含 nnn 个点的一棵生成树中的所有边,问最多可以删几次 题目分析:典中典之欧拉通路构造题,构造方式如下: 在选定某 ...

  4. Minimum spanning tree HDU - 6954

    Minimum spanning tree HDU - 6954 题意: 给定n-1个点,编号从2到n,两点a和b之间的边权重为lcm(a,b).请找出它们形成的最小生成树. 2<=n<= ...

  5. Spanning Tree Protocol介绍

    Spanning Tree Protocol(STP)主要是用在网桥上,用来避免网络回路,并制造冗余连接(也就是保证网络的可靠性). 这里只是一个大概的介绍,具体的还是要去看IEEE 的 802.1D ...

  6. Directed Minimum Spanning Tree: Chu-Liu/Edmonds Algorithm

    我们的现代数据库大作业要求实现一个图查询系统,包括基于属性的子图查询.可达性查询(可选).最短路径查询(可选).TopK最短路径查询(可选).图形化展示(可选)等功能.分成子图同构查询小组以及可达性及 ...

  7. 《Boost》Part1 Minimum Spanning Tree

    <Boost>Part1 Minimum Spanning Tree 1.Boost中的最小生成树介绍 MST最小生成树,是图论中的基本算法,还有一种是最大生成树,此处暂不介绍. 最小生成 ...

  8. 数据结构与算法笔记:贪心策略之BSTBBST, Hashtable+Dictionary+Map, Priority Queue~Heap, Minium Spanning Tree

    BST & BBST BST(Binary Search Tree) 二叉搜索树,也就是使用二叉树来做查找 BBST(Balanced Binary Search Tree) 平衡二叉搜索树 ...

  9. 计算机网络之STP(Spanning Tree Protocol)生成树协议详解及其实验配置

    目录 1.STP概念 1.1  STP选举过程 1.1.1 根桥和根端口的选举 1.1.2 端口角色的选举 2.STP端口状态解释及转换 2.1 STP的五种端口状态 2.2 STP过程中的两种常见问 ...

最新文章

  1. 射极跟随器实验报告数据处理_射极跟随器实验报告模式
  2. 安全与透明:智能互联网的基石
  3. “万维网之父”发文阐述其下一个网络时代:将数据与应用分离,互联网去中心化正在路上...
  4. 【QA】Xcodeproj doesn't know about the following xxx 问题及解决方案
  5. .NET Core开发日志——配置
  6. 个人计算机使用的标准键盘,计算机键盘的基本用法!
  7. SpringMVC 、Struts的区别
  8. 卷积神经网络CNN是靠什么线索学习到深度信息的?
  9. MSSQL 触发器 暂停 和 启动
  10. Windows 各平台远程桌面客户端
  11. 2021年山东省职业院校技能大赛中职组”网络安全“正式赛题
  12. 自动控制原理->控制系统性能
  13. 【MM VS价】移动平均价V标准价格S(一)
  14. http的长连接和短连接(史上最通俗!)以及应用场景
  15. 嵌入式Linux系统开发入门宝典(第2版)
  16. php 实现抽奖接口,PHP转盘抽奖接口实例
  17. 概率论(三)- 全概公式逆概公式(贝叶斯公式)
  18. IE 下JS上传文件时出现“拒绝访问”的解决方案
  19. 【Android Gradle 插件】AaptOptions 配置 ② ( additionalParameters 附加参数配置 | --rename-manifest-package 配置 )
  20. C#中常用控件及其属性的用法

热门文章

  1. 操作无法完成_注意!城里人开始羡慕农村户口啦!4种情况却无法完成分户操作!...
  2. 基于物化视图优化_CVPR2017|基于构造多视图子空间中的潜在表示解决聚类问题
  3. 拖链电缆 机器人电缆_trvv高柔性拖链电缆
  4. maven打包jar单独配置log4j.properites文件记录日志
  5. 如何复制java卡,使用java做一个简单的集卡程序
  6. mysql数据库blob换行_mysql Blob存取的一个简单例子
  7. python pandas dataframe 转json_python-将嵌套的json转换为pandas dataframe
  8. 苹果手机还原网络设置会怎样_装维技巧|手机能连wifi但网不通?
  9. django view
  10. 十三、欧拉离散化计算期权定价期权定价