【吃炸弹的鸽子UVA10765-双联通模板】

·从前有一个鸽子Lence,它吃了一个炸弹,然后有人出了这道题

·英文题,述大意:

       给出一张连通无向图,求出:对于每个点,删去这个点(以及它相连的边以后)时,当前图中的连通块数量,这个值作为该点的Lence值。输出根据Lence值从大到小(相同时标号从小到大)的前m个点和它的Lence值。

·分析:

      关于连通块问题,可以寻得三种方法:

      ①嘎嘣脆算法(Gabow)②塔尔杨算法(Tarjan)③Kosaraju算法。

       此处大米饼采用Tarjan算法。

·干什么呢?寻找并标记双连通分量。

在无向图中发现一个双连通分量(这里指边点连通分量)的意义:就算你任意吃掉一个点,这其中的点依然可以互相到达,也就是所谓的连通块。如果我们将一个图划分为多个双联通分量,就是这样:

·为了方便观赏,使用缩点操作。就是这样:

·所以,我们的方法是:根据点的位置进行分类处理。如果这个点不与桥连接,那么整个图还是联通的。如果该点和桥相连,那我们就猜一猜它和几座桥相连(不是猜,认真算!),那么它的毁灭会带来这些桥的毁灭,每一座桥的毁灭会使得一个双联通分量脱离原图,所以:如果这个点连接了num座桥,那么现在这个图就成了风雨飘荡中的(num+1)个部分。

·注意,在实际处理时,我们是用数组记录下每个点连接的桥的个数,所以如果这点不与桥相连,那么就是0,最终答案为0+1=1,因此不需要特殊处理。美妙的模板is drawing closer!

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define go(i,a,b) for(int i=a;i<=b;i++)
 5 #define fo(i,a,x) for(int i=a[x],v=e[i].v;i;i=e[i].next,v=e[i].v)
 6 #define mem(a,b) memset(a,b,sizeof(a))
 7 using namespace std;const int N=10003;
 8 struct E{int v,next;}e[N*100];struct A{int u,val;}ans[N];bool Cut[N];
 9 int n,m,head[N],k,low[N],dfn[N],t,dfs_clock;
10 bool cmp(A a,A b){return a.val==b.val?a.u<b.u:a.val>b.val;}
11 void ADD(int u,int v){e[k]=(E){v,head[u]};head[u]=k++;}
12 void Tarjan(int u,int fa)
13 {
14     low[u]=dfn[u]=++dfs_clock;int num=0,kids=0;
15     fo(i,head,u)if(v!=fa){if(!dfn[v])
16     {
17         kids++;Tarjan(v,u);low[u]=min(low[u],low[v]);
18         if(dfn[u]<=low[v])num++,Cut[u]=1;}//错写成low[u]
19         else low[u]=min(low[u],dfn[v]);
20     }
21     if(!fa&&kids==1)Cut[u]=0,num=0;ans[++t]=(A){u,num};
22 }
23 int main(){while(scanf("%d%d",&n,&m)&&n)
24 {
25     mem(head,0);mem(low,0);mem(dfn,0);mem(Cut,0);t=dfs_clock=0;k=1;int u,v;
26     while(scanf("%d%d",&u,&v)&&++u&&++v)ADD(u,v),ADD(v,u);
27     go(i,1,n)if(!dfn[i])Tarjan(i,0);sort(ans+1,ans+t+1,cmp);
28     go(i,1,m)printf("%d %d\n",ans[i].u-1,ans[i].val+1);
29 puts("");}return 0;}//Paul_Guderian

让我,感到为难的,是挣扎的自由。————赵雷《成都》

时间: 2024-12-12 03:09:37

【吃炸弹的鸽子UVA10765-双联通模板】的相关文章

HDU 4738 --Caocao&#39;s Bridges 【无向图边双联通 &amp;&amp; 求权值最小的桥 &amp;&amp; 模板】

Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2641    Accepted Submission(s): 855 Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. B

tarjan双联通求割点和桥模板

  求割点 int n,m,stamp,low[1005],dfn[1005],iscut[1005];//iscut记录的为割点 vector<int> vec[1005]; void tarjan(int index,int fa){ int child=0; low[index]=dfn[index]=++stamp; for(int i=0;i<vec[index].size();i++) { int tmp=vec[index][i]; if(!dfn[tmp]) { chil

双联通分量复习

1,边双联通(桥) POJ3177Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17989   Accepted: 7470 Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie an

双联通分量与二分图

我这是耽搁了多长时间才把它整完哈哈哈哈哈: 双联通分量 在无向图中,如果无论删去哪条边都不能使得 u 和 v 不联通,则称 u 和 v 边双连通: 在无向图中,如果无论删去哪个点(非 u 和 v)都不能使得 u 和v 不联通,则称 u 和 v 点双连通. 割点:删去该点,图分裂为多个连通块. 割边:也叫"桥",删去该边,图分裂为多个连通块. 点双连通分量 类似地,定义$ d f n_u 和 low_u$. 如果 v 是 u 的子结点,并且 $low_v ≥ d f n_u $则点 u

hihocoder #1190 : 连通性&#183;四 点双联通分量

http://hihocoder.com/problemset/problem/1190?sid=1051696 先抄袭一下 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho从约翰家回到学校时,网络所的老师又找到了小Hi和小Ho. 老师告诉小Hi和小Ho:之前的分组出了点问题,当服务器(上次是连接)发生宕机的时候,在同一组的服务器有可能连接不上,所以他们希望重新进行一次分组.这一次老师希望对连接进行分组,并把一个组内的所有连接关联的服务器也视为这个组内

图论--无向图点双连通分量模板

对于一个无向图,如果一个点集,它内部的任意一个点对之间,至少有两条点完全不重复的路径,那么这个点集就是原图的一个点双连通分量,而点双联通分量之间是由割点隔开,割点就是如果删去这个点,原图的连通块数会增加,那么这个点就是割点. 通过tarjan算法,我们可以用一次 dfs 标记出所有的割点以及所有双连通分量. 注释版: 1 #include<stdio.h> 2 #include<string.h> 3 #include<stack> 4 #include<algo

无向图双连通分量 模板

//点-双连通分量模板. #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<stack> using namespace std; struct Edge { int u,v; };//u,v是边的两个端点 const int maxn=100005; int n,m; int pre[maxn],iscut[maxn],bccno[ma

[HDOJ4738]Caocao&#39;s Bridges(双联通分量,割边,tarjan)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 给一张无向图,每一条边都有权值.找一条割边,使得删掉这条边双连通分量数量增加,求权值最小那条. 注意有重边,ACEveryDay里群巨给的意见是tarjan的时候记录当前点是从哪条边来的. 注意假如桥的权值是0的时候也得有一个人去炸…… 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7

UVA - 10765 Doves and bombs (双联通分量)

链接 :  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34798 给N个点的无向图并且联通,问删除每次一个点之后还剩多少联通分量. 找割顶 如果删除的是割顶 联通分量就会增加,否则还是1(因为原图是联通图),删除割顶之后 联通块的数目 就要看该割顶在几个双联通分量里出现过. #pragma comment(linker, "/STACK:10240000,10240000") #include <a