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 ...
随机推荐
- 链表--笔记--数据结构(C++版)王红梅--自我思路整理与梳理
看到这篇文的很多人大概都知道链表是个什么玩意了.简单说就是一个又一个的指针,指针之间用指针连接起来. 本文的阅读 适合有c++基础的人群 以下: 这叫做一个结点. 这就是一个链表.我们主要使用的是 ...
- C++多线程基础学习笔记(八)
shared_futrue和futrue_status的用法 shared_futrue是一个类模板,类似于futrue,不同的是它的成员函数get()可以使用多次,因为是复制数据,而futrue的g ...
- PYQT5 pyinstaller 打包工程
win+R 输入cmd 回车 首先安装 pyinstaller : pip install pyinstaller 安装 pywin32: pip install pywin32 在cmd中输入工程 ...
- 三维数点的CDQ分治板子
int n, k, tot; struct _ {int x,r,f;} a[N]; struct __ { int type; ll x,y; bool operator < (const _ ...
- ajax实现异步操作实例1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 分布式的几件小事(六)dubbo如何做服务治理、服务降级以及重试
1.服务治理 服务治理主要作用是改变运行时服务的行为和选址逻辑,达到限流,权重配置等目的. ①调用链路自动生成 一个大型的分布式系统,会由大量的服务组成,那么这些服务之间的依赖关系和调用链路会很复杂, ...
- JavaScript金字塔打印
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- leetcode297. 二叉树的序列化与反序列化
代码 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...
- 利用python3 爬虫 定制版妹子图mzitu爬取
在刚开始学爬虫的时候,用来练手的基础爬虫就是爬取各种妹子图片,前几天同时说了这个,便准备随便写一个...最后发现真是三天不练..什么都记不住了!!所以花了政治一天重新写了一个爬虫程序,并且支持按照时间 ...
- linux 查看cpu核心数
1.查看CPU个数 cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l 2.查看每个物理CPU含有的核心个数 cat /pr ...