题目链接:https://vjudge.net/problem/UESTC-900

 

方老师炸弹

Time Limit: 4000/2000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit 
Status

方老师准炸毁学校,学校可以被看做是一个图包含NN个顶点和MM条边(顶点从00开始标号),方老师发明了一个方老师炸弹。

这个炸弹可以炸毁某一个节点和与这个节点相连的所有边。但是方老师现在很彷徨,他想使得使用了一个炸弹之后学校炸成更多的联通块。

方老师想知道把学校炸成尽量多块的放置点的前KK个顶点是哪些,这些点可以被把学校炸成多少个联通块?

Input

  • 多组数据,EOF结束。
  • 第11行:NN和MM和KK
  • 第22到第M+1M+1行:每一行22个数UiUi和ViVi,表示UiUi到ViVi之间有一条边。

Output

KK行,每行22个数PosiPosi,CiCi,用空格隔开,表示在PosiPosi点放置炸弹可以把学校炸成CiCi块。如果对于不同的点可以把学校炸成相同多块,优先输出编号小的顶点。

每组数据后面输出一个空行

Sample input and output

Sample Input Sample Output
  1. 8 8 4
  2. 0 4
  3. 1 2
  4. 2 3
  5. 2 4
  6. 3 5
  7. 3 6
  8. 3 7
  9. 6 7
  1. 2 3
  2. 3 3
  3. 4 2
  4. 0 1

Hint

K≤N≤10000K≤N≤10000,M≤100000







题解:

割点的裸题。

代码如下:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. typedef long long LL;
  7. const int INF = 2e9;
  8. const LL LNF = 9e18;
  9. const int mod = 1e9+;
  10. const int maxn = +;
  11.  
  12. int n, m, k,vis[maxn], low[maxn], dfn[maxn], stamp;
  13.  
  14. struct node //q[i].x为删除结点i后增加的连通块
  15. {
  16. int x, id;
  17. bool operator<(const node &a)const{
  18. if(x==a.x) return id<a.id;
  19. return x>a.x;
  20. }
  21. }q[maxn];
  22.  
  23. struct
  24. {
  25. int v, next;
  26. }edge[maxn*];
  27. int tot, head[maxn];
  28.  
  29. void add(int u, int v)
  30. {
  31. edge[tot].v = v;
  32. edge[tot].next = head[u];
  33. head[u] = tot++;
  34. }
  35.  
  36. void dfs(int u, int pre)
  37. {
  38. dfn[u] = low[u] = ++stamp;
  39. for(int i = head[u]; i!=-; i = edge[i].next)
  40. {
  41. int v = edge[i].v;
  42. if(v==pre) continue;
  43. if(!dfn[v])
  44. {
  45. dfs(v, u);
  46. low[u] = min(low[u], low[v]);
  47. if(low[v]>=dfn[u])
  48. q[u].x++;
  49. }
  50. else
  51. low[u] = min(low[u],dfn[v]);
  52. }
  53. }
  54.  
  55. int main()
  56. {
  57. while(scanf("%d%d%d",&n,&m,&k)!=EOF)
  58. {
  59. memset(vis,, sizeof(vis));
  60. memset(low,, sizeof(low));
  61. memset(dfn,, sizeof(dfn));
  62. memset(head,-, sizeof(head));
  63. for(int i = ; i<n; i++)
  64. {
  65. q[i].x = ;
  66. q[i].id = i;
  67. }
  68. q[].x = ;
  69.  
  70. tot = ;
  71. for(int i = ; i<m; i++)
  72. {
  73. int u, v;
  74. scanf("%d%d",&u,&v);
  75. add(u,v);
  76. add(v,u);
  77. }
  78.  
  79. stamp = ;
  80. dfs(,-);
  81. sort(q, q+n);
  82. for(int i = ; i<k; i++)
  83. printf("%d %d\n",q[i].id, q[i].x);
  84. putchar('\n');
  85. }
  86. }

UESTC - 900 方老师炸弹 —— 割点的更多相关文章

  1. UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数

    Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...

  2. UESTC 898 方老师和缘分 --二分图匹配+强连通分量

    这题原来以为是某种匹配问题,后来好像说是强连通的问题. 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u-> ...

  3. UESTC 884 方老师的专题讲座 --数位DP

    定义:cnt[L][K]表示长度为L,最高位为K的满足条件C的个数. 首先预处理出cnt数组,枚举当前长度最高位和小一个长度的最高位,如果相差大于2则前一个加上后一个的方法数. 然后给定n,计算[1, ...

  4. UESTC 885 方老师买表 --状压DP

    将方格的摆放分成两种: 1.水平摆放:此时所占的两个格子都记为1. 2.竖直摆放:此时底下那个格子记为1,上面那个记为0. 这样的话,每行都会有一个状态表示. 定义:dp[i][s]表示考虑已经填到第 ...

  5. UESTC 883 方老师与两个串 --二分搜索+DP

    CF原题 由题可知,n,m太大,无法开出dp[n][m]的数组. 观察发现s/e最大为300,也就是说,选用第一种操作的次数不会超过300. 于是定义dp[i][j],第一个串的前i个数,使用了j次第 ...

  6. UESTC 886 方老师金币堆 --合并石子DP

    环状合并石子问题. 环状无非是第n个要和第1个相邻.可以复制该行石子到原来那行的右边即可达到目的. 定义:dp[i][j]代表从第i堆合并至第j堆所要消耗的最小体力. 转移方程:dp[i][j]=mi ...

  7. UESTC 899 方老师和农场 --双连通分量的构造

    首先将原图中的连通分量缩点,一定可以将原图缩成一棵树的形式,然后统计这棵树的叶子节点个数,答案就是(leaf+1)/2.这里不再证明,可以画个图看一下. (简单说明一下,首先把两个最近公共祖先最远的两 ...

  8. UESTC 901 方老师抢银行 --Tarjan求强连通分量

    思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...

  9. UESTC 914 方老师的分身I Dijkstra

    题意:求有向图的往返最短路的最长长度. 分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来.考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果. 所以 ...

随机推荐

  1. 利用注解和反射,将Bean枚举字段的值填入相应的字段中,并转化为fastjson返回前台

    需求:需要将枚举类型的字段例如enable(是否启用)转化为enable:1,enableName:是.这种形式返回给前台. 思路:在bean字段上加上枚举类型的注解,通过字段的值和枚举类反射获取枚举 ...

  2. Kalendae使用总结

    2019-03-06 16:50:18 git官方教程:https://github.com/Twipped/Kalendae js.css:https://pan.baidu.com/s/1Ye-d ...

  3. mc

    Description 小C在MC里有n个牧场,自西向东呈一字形排列(自西向东用1-n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站, 每个牧场上只能建立一个控制站,每个控 ...

  4. android showmessage

    package com.example.yanlei.yl6; import android.annotation.TargetApi; import android.app.Activity; im ...

  5. Java多线程之~~~ReadWriteLock 读写分离的多线程实现

    在多线程开发中,常常会出现一种情况,我们希望读写分离. 就是对于读取这个动作来说,能够同一时候有多个线程同 时去读取这个资源,可是对于写这个动作来说,仅仅能同一时候有一个线程来操作.并且同一时候,当有 ...

  6. 我的Android进阶之旅------&gt;怎样解决Android 5.0中出现的警告: Service Intent must be explicit:

    我的Android进阶之旅-->怎样解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...

  7. PHP如何学习?

    PHP 的学习,可以归纳为三个类型:      语言的基础语法学习,这些是 ifelse, while, switch, class, function, trait 等:  内置函数/类学习,这 ...

  8. 分享ArcGIS Server 10.0修复安装心得

    最近,捣腾了一阵子在xp系统上安装ArcGIS Server10.0(下方均简称server),解决了一些初学者可能面临的problem,给大家贴出来, 希望能够给初学者一些有益的帮助. 我的系统环境 ...

  9. Google的分布式计算模型Map Reduce map函数将输入分割成key/value对

    http://www.nowamagic.net/librarys/veda/detail/1768 上一篇 大规模分布式数据处理平台Hadoop的介绍 中提到了Google的分布式计算模型Map R ...

  10. Ubuntu下安装libsvm

    在安装LibSVM前需要先装 python 和 gnuplot linux 一般都自带了python2.7,所以python的安装不再赘述 在 ubuntu 下安装 gnuplot 不能直接 sudo ...