Description

给定一个n个点m条边的无向图,问最少删掉多少条边能使得编号小于等于k的点都不在环上。

Analysis

包含关键点的环中

包含从关键点连出的两条边

考虑我们删边删哪些边更优

根据贪心

我们会删与关键点相连的边

一直删我们发现不会删掉不与关键点相连的边

Solution

于是我们先把边顶点都大于k的先连起来

相当于合并了一些点

在新的图里,每个连通块里都不能生成环

那最多保留一棵生成树

Solution

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <cmath>
using namespace std;
const int M=1000007; inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
} int n,m,k;
int f[M],hav[M]; struct node{
int x,y;
node(int xx=0,int yy=0){x=xx;y=yy;}
}ed[M<<1];
int te; int find(int x){
return (f[x]==x)?x:(f[x]=find(f[x]));
} int link(int x,int y){
x=find(x);y=find(y);
if(x!=y){
f[x]=y;
hav[y]=hav[x]|hav[y];
return 0;
}
return hav[x];
} int main(){
int i,x,y,ans=0;
n=rd(),m=rd(),k=rd();
for(i=1;i<=n;i++) f[i]=i;
for(i=1;i<=k;i++) hav[i]=1;
for(i=1;i<=m;i++){
x=rd(),y=rd();
if(x>k&&y>k){
link(x,y);
}
else ed[++te]=node(x,y);
}
for(i=1;i<=te;i++)
ans+=link(ed[i].x,ed[i].y);
printf("%d\n",ans);
return 0;
}

最新文章

  1. Java公众号推荐 - BeJavaGod
  2. Markdown learning
  3. mysql 主从同步原理
  4. c++11中的for简化用法
  5. javascript arguments与javascript函数重载
  6. 为不同浏览器创建XMLHttpRequest对象
  7. Codeforces Round #215 (Div. 2) B. Sereja and Suffixes map
  8. translate函数说明
  9. safari浏览器cookie问题
  10. 如何使用composer?
  11. HDU 1045(Fire Net)题解
  12. MySQL分区表的局限和限制
  13. [目标检测]PVAnet原理
  14. Java异常处理示例
  15. C++二维数组、指针、对象数组、对象指针
  16. 皮尔逊残差 | Pearson residual
  17. 26.pymysql、pymongo、redis-py安装
  18. BZOJ 4198: [Noi2015]荷马史诗 哈夫曼树 k叉哈夫曼树
  19. Mysql -- 设置中国时区时间
  20. 解决跨域HttpResponseJsonCORS, HttpResponseCORS 返回字典数据

热门文章

  1. TDB文件介绍
  2. 关于java字符串常量池
  3. PAT (Basic Level) Practise (中文)- 1012. 数字分类 (20)
  4. 02_5if switch分支与循环语句
  5. OC和C++的混用2
  6. Linux 用户管理(一)
  7. 【mac】【php】mac php开机重启
  8. 将php数组转js数组,js如何接收PHP数组,json的用法
  9. 请问batch_normalization做了normalization后为什么要变回来?
  10. python基础学习笔记——反射