poj Transferring Sylla(怎样高速的推断一个图是否是3—连通图,求割点,割边)
Transferring Sylla
首先。什么是k连通图?
k连通图就是指至少去掉k个点使之不连通的图。
题目:
题目描写叙述的非常裸。就是给你一张图要求你推断这图是否是3-连通图。
算法分析:
/////////////////////////////////////////////////////////////////////
(网上别人的分析,分析的非常好所以直接引用了)
考虑一下不可行的情况。就是存在两点间的路径条数<3情况,那么我们能够去枚举两个点a和b,然后将其和相邻的边删除。然后推断联通块个数,假设块数大于1则存在路径条数<3的情况,否则不存在,由于假设a和b是一个路径条数<3的点对的路径上的点。假设将其破坏了,这两个点必定不会再联通。由于不可行的情况路径条数最多为2,因此仅仅须要枚举两个点。
/////////////////////////////////////////////////////////////////////////
可是这肯定超时。
所以。我们还要优化。我们能够想到既然枚举两个点会超时。那么如今我仅仅枚举一个点呢?当然是能够的。
可是,为什么能够仅仅枚举一个点呢?由于,我们从割点的定义能够知道当一个图是强连通图时候,那么他一定没有割点。
所以。当我们枚举到了删除点的时候。那么在剩下的图中假设存在割点那个这个图一定不是3-连通图。由于。此时我们仅仅要删除两条边就能够使其不连通了。
给出求解割点割边的模板,这题仅仅要一套模板就能够了。
///////////// DATA /////////////////////
vector<int> G[MAXN];
int V,E;
bool cut[MAXN]; // 是否是割点
int color[MAXN]; //0:没有訪问 1:正在訪问 2:已经訪问
int lowc[MAXN]; //表示i及i的子孙相连的辈分最高的祖先节点所在的深度
int d[MAXN]; //表示i节点在树中的深度
int root; //根节点
int fath; //父节点
int pcnt; //割点个数
int egcnt; //割边个数
bool flag; //是否存在割点 ///////////// DATE END //////////////////////// //初始化
void init(){
flag = false;
for(int i = 0;i <= V;++i)
G[i].clear();
} ///////////////// Tarjan ////////////////////// void dfs(int u,int fa,int deep){
color[u] = 1; //正在訪问
lowc[u] = d[u] = deep; // 深度
int tot = 0; //子树个数
int i,v;
for(i = 0;i < (int)G[u].size();++i){
v = G[u][i];
if(v != fa&&color[v] == 1){
lowc[u] = min(lowc[u],d[v]);
}
if(0 == color[v]){
dfs(v,u,deep + 1);
tot++; //子树 +1
lowc[u] = min(lowc[u],lowc[v]);
//求割点
if((u == root&&tot > 1)||(u != root&&lowc[v] >= d[u])){
cut[u] = 1; //不能将pcnt++写到这里
flag = true;
} /* //求割边 u - > v是割边
if(lowc[v] > d[u]){
edge[u][v] = true;
} */
}
}
color[u] = 2;
} //////////// END Tarjan /////////////// void calc(int del){
pcnt = egcnt = 0;
memset(cut,0,sizeof(cut));
memset(color,0,sizeof(color));
memset(lowc,0,sizeof(lowc));
memset(d,0,sizeof(d)); color[del] = 2;
root = 0;
if(del == 0)
root = 1;
dfs(root,-1,1); /* //统计割点个数
for(int i = 0;i < V;++i)
if(cut[i]) pcnt++; */
}
//求图是否是三连通
void solve(){ for(int i = 0;i < V;++i){
calc(i); //推断图是否连通
for(int j = 0;j < V;++j){
if(0 == color[j]){
flag = true;
break;
}
} if(flag) break;
}
}
poj Transferring Sylla(怎样高速的推断一个图是否是3—连通图,求割点,割边)的更多相关文章
- POJ - 3249 Test for Job (在DAG图利用拓扑排序中求最长路)
(点击此处查看原题) 题意 给出一个有n个结点,m条边的DAG图,每个点都有权值,每条路径(注意不是边)的权值为其经过的结点的权值之和,每条路径总是从入度为0的点开始,直至出度为0的点,问所有路径中权 ...
- POJ 3713 Transferring Sylla (三连通图)
[题目链接] http://poj.org/problem?id=3713 [题目大意] 给出一个图判断是不是三连通图,三连通图的意思是对于图中任意两点, 至少有三条路是可以相互连通的. [题解] 我 ...
- [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29971 Accepted: 10844 Descr ...
- POJ 3713 Transferring Sylla (三联通分量)
Transferring Sylla Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3533 Accepted: 988 ...
- 如何推断一个P2P平台是否靠谱?
推断一个站点,是否靠谱.是有规律可循的.P2P平台算是个新兴的电商类站点. 网上欺诈类的站点.不限于P2P,实在是太多了,真的有必要总结下最关键的几个靠谱指标. 最关键的2个 1.创始人和 ...
- HDU 2454 Degree Sequence of Graph G(Havel定理 推断一个简单图的存在)
主题链接:pid=2454">http://acm.hdu.edu.cn/showproblem.php?pid=2454 Problem Description Wang Haiya ...
- POJ 1144 Network(无向图连通分量求割点)
题目地址:id=1144">POJ 1144 求割点.推断一个点是否是割点有两种推断情况: 假设u为割点,当且仅当满足以下的1条 1.假设u为树根,那么u必须有多于1棵子树 2.假设u ...
- POJ 1144 Network(Tarjan求割点)
Network Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12707 Accepted: 5835 Descript ...
- poj 1144 (Tarjan求割点数量)
题目链接:http://poj.org/problem?id=1144 描述 一个电话线公司(简称TLC)正在建立一个新的电话线缆网络.他们连接了若干个地点分别从1到N编号.没有两个地点有相同的号码. ...
随机推荐
- nj09---util、inherits、inspect、events、error
一.util全局变量 1.util.inherits(constructor,superConstructor) 此方法是一个实现对象间原型继承的函数.javaScript通过原型赋值来实现继承,细节 ...
- Classes and functions
As another example of a user-defined type, we’ll define a class called Time that records the time of ...
- Objects and values
If we execute these assignment statements: We know that a and b both refer to a string, but we don’t ...
- View的双击动作
有时在android中需要为某一控件设置双击监听,实现也挺简单,自己动手吧.编码永远不是问题,思路才是最重要. public class DoubleClickDemo extends Activit ...
- 200 from memory cache / from disk cache / 304 Not Modified 区别
三者情况有什么区别和联系,什么情况下会发生200 from memory cache 或 200 from disk cache 或 304 Not Modified? 200 from memory ...
- Javascript中正则的 match、test、exec使用方法和区别
总结: match 是str调用 test和exec是正则表达式调用 test只返回true或false, exec和match的结果是相同的,返回结果比较复杂
- iOS开发——NSString小结
1.创建常量字符串. NSString *astring = @"This is a String!"; 2.创建空字符串,给予赋值. NSString *astring = ...
- Java web application——Listener
应用程序事件提供ServletContext和HttpSession以及ServletRequest对象状态更改的通知,用户编写响应状态更改的事件监听器类,并配置和部署他们.Servlet容器会调用事 ...
- 【Loadrunner】Vugen录制脚本为空的解决办法
1. ie -> 工具 -> Internet选项 - 高级 - 勾除“启动第三方浏览器扩展选项”,然后重启电脑 2. 还有一种可能,就是机器上安装了多个浏览器,从而导致出现问题,解决方法 ...
- GenIcam标准(六)
2.9.可用的接口 本章用伪代码列出在2.3章介绍过的最重要的接口.对每个接口,实际的实现可以提供更多的方法,例如,除了SetValue(value)方法,还可以用直接映射到SetValue()的方式 ...