HDU4587--TWO NODES(无向图割点,暴力出奇迹)这是我见过的时间最长的题。。。
TWO NODES
Time Limit: 24000/12000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2072 Accepted Submission(s): 683
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
Recommend
zhuyuanchen520
/**********************我是分割线**************************/
12000秒,见过的时间最长的题目,发篇博客纪念一下
/**********************我是分割线**************************/
题意:
给你一个无向图,问你从这个无向图中删除任意两个点之后所能获得的独立连通分量个数的最大值.
分析:
12000秒,500个点,不暴一下真的对不起出题人。。。。
枚举要删的第一个点,然后Tarjan,Tarjan完事之后在找到删掉之后增加最多联通分量的点
代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int MAXN = 10010;
4 const int MAXM = 100010;
5 struct Edge
6 {
7 int to, next;
8 bool cut;//是否为桥的标记
9 } edge[MAXM];
10 int head[MAXN], tot;
11 int Low[MAXN]; //low记录了某个点能到达的最晚标号
12 int DFN[MAXN]; //某个点遍历到的标号
13 int Index, top; //DFS的时钟
14 bool cut[MAXN]; //记录某个点是否是割顶
15 int add_block[MAXN]; //删除一个点后增加的连通块
16 int bridge;
17 void addedge(int u, int v)
18 {
19 edge[tot].to = v; edge[tot].next = head[u]; edge[tot].cut = false;
20 head[u] = tot++;
21 }
22 void Tarjan(int u, int pre,int f)
23 {
24 //cout<<333333<<endl;
25 int v;
26
27 Low[u] = DFN[u] = ++Index;
28
29 int son = 0;
30 for (int i = head[u]; i != -1; i = edge[i].next)
31 {
32 v = edge[i].to;
33 if (v == pre)continue;
34 if (v == f) continue;
35 if ( !DFN[v] )
36 {
37 son++;
38 Tarjan(v, u,f);
39 if (Low[u] > Low[v]) Low[u] = Low[v];
40 //割点
41 //一个顶点u是割点,当且仅当满足(1)或(2) (1) u为树根,且u有多于一个子树。
42 //(2) u不为树根,且满足存在(u,v)为树枝边(或称父子边,
43 //即u为v在搜索树中的父亲),使得DFS(u)<=Low(v)
44 if (u != pre && Low[v] >= DFN[u]) //不是树根
45 {
46 cut[u] = true;
47 add_block[u]++;
48 }
49 }
50 else if ( Low[u] > DFN[v]) //!!!
51 Low[u] = DFN[v];
52 }
53 //树根,分支数大于1
54 if (u == pre && son > 1)cut[u] = true;
55 if (u == pre)add_block[u] = son - 1;
56
57 }
58 int solve(int N)
59 {
60 int ori=0;
61 int ans = -1;
62 for(int j=0;j<N;j++){
63 ori=0;
64 memset(DFN,0,sizeof(DFN));
65 memset(add_block,0,sizeof(add_block));
66 memset(cut,false,sizeof(cut));
67 Index = top = 0;
68 bridge = 0;
69 for(int i = 0;i< N;i++)
70 if(i!=j&&!DFN[i]){
71 ori++;
72 Tarjan(i,i,j);
73 }
74 for(int i = 0;i <N;i++){
75 if(i!=j)
76 ans=max(ans,add_block[i]+ori);
77 }
78 }
79 return ans;
80 }
81
82 int main()
83 {
84 int n,m;
85 int u,v;
86 while(~scanf("%d%d",&n,&m)){
87 memset(head,-1,sizeof(head));
88 tot=0;
89 for(int i=0;i<m;i++){
90 scanf("%d%d",&u,&v);
91 addedge(u,v);
92 addedge(v,u);
93 }
94 printf("%d\n",solve(n));
95 }
96 }
97
HDU4587--TWO NODES(无向图割点,暴力出奇迹)这是我见过的时间最长的题。。。的更多相关文章
- SID1190471 / 烦人的幻灯片 暴力出奇迹 !!!!!!!!!!!!!!!!!!
PID221 / 烦人的幻灯片 ☆ 提交你的代码 查看讨论和题解 你还木有做过哦 我的状态 查看最后一次评测记录 质量还不能统计出来哦~ 题目评价 质量 无 ★★★★★ ★★★★☆ ★ ...
- 紫书 习题 8-2 UVa 1610 (暴力出奇迹)
这道题我真的想的非常的复杂, 拿草稿纸一直在找规律,推公式, 然后总有一些特殊的情况. 然后就WA了N次.无奈之下看了别人的博客, 然后就惊了.直接暴力枚举两个相邻字符串 里面的所有可能就可以了--真 ...
- Codeforces Round VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM 暴力出奇迹!
VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM Time Lim ...
- Prime Matrix(暴力出奇迹)
Description You've got an n × m matrix. The matrix consists of integers. In one move, you can apply ...
- Codeforces - 570D 离散DFS序 特殊的子树统计 (暴力出奇迹)
题意:给定一棵树,树上每个节点有对应的字符,多次询问在\(u\)子树的深度为\(d\)的所有节点上的字符任意组合能否凑成一个回文串 把dfs序存储在一个二维线性表中,一个维度记录字符另一个维度记录深度 ...
- 51nod——1285 山峰和分段(暴力出奇迹)
要求每段的点数都一样,因此分的段数cnt肯定是n的因子,要求每段都有山峰,因此cnt肯定小于等于山峰数量.分段的宽度d=n/cnt,对山峰数量做一个前缀和,检查一下每一段的山峰数量是否没有增加即可. ...
- 【杂】暴力出奇迹,lz水数据
做了个填涂颜色的题qwq 洛谷上的qwq,然后我就把这道题水过去了qwq(显然这是不对的,我们不能水数据qwq)当然我本身是80分的qwq end-
- Post Lamps CodeForces - 990E(暴力出奇迹?)
题意: 在一个从0开始的连续区间上 放置几个小区间,使得这些小区间覆盖整个大区间,不同长度的小区间有不同的花费,其中有m个点,小区间的左端点不能放在这些点上 解析: 显然如果0是这m点中的一个 则无 ...
- Manthan, Codefest 16 H. Fibonacci-ish II 大力出奇迹 莫队 线段树 矩阵
H. Fibonacci-ish II 题目连接: http://codeforces.com/contest/633/problem/H Description Yash is finally ti ...
随机推荐
- 安装Python环境
首先我们来安装Python,Python3.5+以上即可 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图 ...
- MapReduce框架中的Shuffle机制
Shuffle是map和reduce中间的数据调度过程,包括:缓存.分区.排序等. Shuffle数据调度过程: map task处理hdfs文件,调用map()方法,map task的collect ...
- EBS自动行号,行金额自动汇总到头,金额根据币种编号总结
一.自动行号实现 1.方法一: 只需要将“序号”定义成公式,并将公式设置为:get_block_property('block_name',current_record)就可以实现了,或者把这行语句放 ...
- jsp页面中使用 splitfn:split注意事项
我们有一个 字段存储内容是 xxxx意见~~@~~是 在页面上需要分开显示,格式为 xxx意见 是 使用 ${fn:split(comments, '~~@~~')[1]} 来分割是发现出现@符文字 ...
- loj 6031「雅礼集训 2017 Day1」字符串
loj 注意到每次询问串长度都是给定的,并且询问串长\(k*\)询问次数\(q<10^5\),所以这里面一个东西大的时候另一个东西就小,那么考虑对较小的下功夫 如果\(k\le \sqrt{n} ...
- 26 Python模块之paramiko
paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能.这是一个第三方的软件包,使用之前需要安装. 1. 基于用户名和密码的sshclient方式登录 #创建一个ssh ...
- Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)
参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/ 1.首先,spring的AOP作用范围很广,可以使用Aspec ...
- deep_learning_Function_tensorflow_random_normal_initializer
函数原型:tf.random_normal_initializer(mean=0.0, stddev=1.0, seed=None, dtype=tf.float32) 返回一个生成具有正态分布的张量 ...
- Ubuntu中出现“Could not get lock /var/lib/dpkg/lock”的解决方法
在运行Ubuntu安装软件,使用命令sudo apt-get install时,有时会出现以下的错误: E: Could not get lock /var/lib/dpkg/lock - open ...
- 分布式特点理解-Zookeeper准备
分布式环境特点 分布性 地域,区域,机房,服务器不同导致分布性 并发性 程序运行中,并发性操作很常见,比如同一个分布式系统中的多个节点,同时访问一个共享资源(数据库,分布式存储) 无序性 进程之间的消 ...