hdu 4587(枚举+割顶)

TWO NODES

Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2354    Accepted Submission(s): 780

Problem Description

Suppose that G is an undirected graph, and the value of stab is defined as follows:

Among the expression,G-i, -j is the remainder after removing node i, node j and all edges that are directly relevant to the previous two nodes. cntCompent is the number of connected components of X independently.
Thus, given a certain undirected graph G, you are supposed to calculating the value of stab.

Input

The
input will contain the description of several graphs. For each graph,
the description consist of an integer N for the number of nodes, an
integer M for the number of edges, and M pairs of integers for edges
(3<=N,M<=5000).
Please note that the endpoints of edge is marked in the range of [0,N-1], and input cases ends with EOF.

Output

For each graph in the input, you should output the value of stab.

Sample Input

4 5

0 1

1 2

2 3

3 0

0 2

Sample Output

2

Source

2013 ACM-ICPC南京赛区全国邀请赛——题目重现

题意:在一个无向图中,删除两个点,使的连通分量最大 输出最大的联通分量

枚举一个点 然后在剩下的n个点中选取一个点做顶点 然后利用割顶的性质判断这n-1个点的可以拆成多少个联通分量

其实就是在判断割顶的地方iscut[u]++;

但我们需要注意的是当选取的点是根节点时:incut[u]=0,因为他是没有父亲的,意思就是上面没有联通分量了

所以不是根节点的初始值就是iscut[u]=1,因为他的父亲那块是一个联通分量

由于删点会导致这个图不联通,所以需要DFS,看有几个联通块sum

最后的答案就是 max(sum+iscut[i]-1)

这个减1是因为将一个联通块拆成iscut[i]个 那么本身的联通块就没有了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<string.h>
 7 #include<set>
 8 #include<vector>
 9 #include<queue>
10 #include<stack>
11 #include<map>
12 #include<cmath>
13 typedef long long ll;
14 typedef unsigned long long LL;
15 using namespace std;
16 const double PI=acos(-1.0);
17 const double eps=0.0000000001;
18 const int INF=1e9;
19 const int N=10000+100;
20 int head[N];
21 int t,tot;
22 struct node{
23     int to,next;
24 }edge[N<<1];
25 int low[N];
26 int dfn[N];
27 int iscut[N];
28 void init(){
29     memset(low,0,sizeof(low));
30     memset(dfn,0,sizeof(dfn));
31     t=0;
32 }
33 void add(int u,int v){
34     edge[tot].to=v;
35     edge[tot].next=head[u];
36     head[u]=tot++;
37 }
38 int DFS(int u,int fa,int flag){
39     low[u]=dfn[u]=++t;
40     int child=0;
41     for(int i=head[u];i!=-1;i=edge[i].next){
42         int v=edge[i].to;
43         if(v==flag)continue;
44         if(dfn[v]==0){
45             child++;
46             int lowv=DFS(v,u,flag);
47             low[u]=min(low[u],lowv);
48             if(lowv>=dfn[u]){
49                 iscut[u]++;
50             }
51         }
52         else if(dfn[v]<dfn[u]&&v!=fa){
53             low[u]=min(low[u],dfn[v]);
54         }
55     }
56     if(fa<0&&child==1)low[u]=0;
57     return low[u];
58 }
59 int main(){
60     int n,m;
61     while(scanf("%d%d",&n,&m)!=EOF){
62         memset(head,-1,sizeof(head));
63         tot=0;
64         for(int i=1;i<=m;i++){
65             int u,v;
66             scanf("%d%d",&u,&v);
67             add(u,v);
68             add(v,u);
69         }
70         int ans=0;
71         for(int i=0;i<n;i++){
72             int sum=0;
73             init();
74             for(int j=0;j<n;j++){
75                 iscut[j]=1;
76             }
77             iscut[i]=0;
78             for(int j=0;j<n;j++){
79                 if(i==j)continue;
80                 if(dfn[j])continue;
81                 iscut[j]=0;
82                 sum++;
83                 DFS(j,-1,i);
84
85             }
86             for(int j=0;j<n;j++){
87                 ans=max(ans,iscut[j]+sum-1);
88             }
89         }
90         cout<<ans<<endl;
91     }
92 }
时间: 2024-10-31 03:04:04

hdu 4587(枚举+割顶)的相关文章

无向图求割顶与桥

无向图求割顶与桥 对于无向图G,如果删除某个点u后,连通分量数目增加,称u为图的关节点或割顶.对于连通图,割顶就是删除之后使图不再连通的点.如果删除边(u,v)一条边,就可以让连通图变成不连通的,那么边(u,v)是桥. 具体的概念和定义比较多,在刘汝佳<<训练指南>>P312-314页都有详细的介绍. 下面来写求无向图割顶和桥的DFS函数.我们令pre[i]表示第一次访问i点的时间戳,令low[i]表示i节点及其后代所能连回(通过反向边)的最早祖先的pre值. 下面的dfs函数返回

hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。

题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有的连通分量只有一个点,当舍去该点时候,连通分量-1: 复习求割点的好题! #include<iostream> #include<cstdio> #include<vector> using namespace std; int n,m; vector<vector&

hdu 4587 判断孤立点+割点+ 删除点之后,剩下多少连通分量

做了很久...... 题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4587 先枚举删除的第一个点,第二个点就是找割点,没有割点当然也有答案 学到的: 1.图论硬套模板不太现实,比如这道题,我能想到孤立点是特殊情况,删除孤立点,连通分支个数会减少一,但是一直处理不好,最后按缩点的做法搞了, 判断是不是孤立点的方法: 就是先用一个数组scnt[i]=j,vv[j]++  表示点i在以j为祖先的联通分支里,而且每次都让vv[j]++,就使得vv[j

hdu 3657 最小割的活用 / 奇偶方格取数类经典题 /最小割

题意:方格取数,如果取了相邻的数,那么要付出一定代价.(代价为2*(X&Y))(开始用费用流,敲升级版3820,跪...) 建图:  对于相邻问题,经典方法:奇偶建立二分图.对于相邻两点连边2*(X&Y),源->X连边,Y->汇连边,权值w为点权. ans=总点权-最小割:如果割边是源->X,表示x不要选(是割边,必然价值在路径上最小),若割边是Y-汇点,同理:若割边是X->Y,则表示选Y点且选X点, 割为w( 2*(X&Y) ). 自己的确还没有理解其本质

图论(无向图的割顶):POJ 1144 Network

Network Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers from 1 to N . No two places have the same number. The lines are bidirectional and always connect

UVA - 315 Network 和 UVA - 10199 (求割顶)

链接 :  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20837 http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21278 求割顶的裸题. UVA - 315 #include <algorithm> #include <iostream> #include <sstream> #include <cstrin

【模板】无向图的割顶

无向图的割顶: Vector <int> G[] :邻接表存图 Int pre[] :存储时间戳 Int low[] : u及其后代所能连回的最早的祖先的pre值 Int iscut[] : =true表示是割顶,=false不是割顶 Dfs函数在主函数调用时,fa预设为-1. vector <int> G[MAXN]; int pre[MAXN],iscut[MAXN],low[MAXN],dfs_clock; int dfs(int u,int fa) { int lowu=p

找割顶的模板

用邻接矩阵写的.自己慢慢理解吧 #include <iostream> #include <cstring> using namespace std; #define CC(c) memset(c, 0, sizeof(c)) const int maxn=5000; int iscut[maxn], g[maxn][maxn], low[maxn], pre[maxn], _pre, n, m; int dfs(int u, int fa) { low[u]=pre[u]=++_

uoj#67. 新年的毒瘤(割顶)

#67. 新年的毒瘤 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用n个结点m 条无向边的无向图表示.这个图中有一些结点被称作是毒瘤结点,即删掉这个结点和与之相邻的边之后,这个图会变为一棵树.树也即无简单环的无向连通图. 现在给你这个无向图,喜羊羊请你帮他求出所有毒瘤结点. 样例一 input 6 6 1 2 1 3 2 4 2 5 4 6 5 6 output 3 4 5 6 256MB 来源 UOJ Goodbye Jiawu [思路] 无向