TOJ 2299. Electricity【求无向图割点】
来源:互联网 发布:卖域名 赚钱么 编辑:程序博客网 时间:2024/05/17 07:57
公告:博客新增直接引用代码功能 专访谭海燕:移动互联网开发的那些事 CSDN博客频道自定义域名、标签搜索功能上线啦!
TOJ 2299. Electricity【求无向图割点】
分类: 【图论专辑】2010-07-24 02:55 112人阅读 评论(0) 收藏 举报
/* 给出一个无向图,计算去掉一个点后所能得到的最大块数
* 1)由于图可能不连通,先DFS求出图的块数num
* 2)然后进行DFS求出割点并且存下割点将连通分支分成的块数f[i]
* 3)找到最大的f[i]和num相加-1即为所求
*/
Code:
- #include <cstdio>
- #include <cstring>
- #include <vector>
- #define MAXN 10002
- using namespace std;
- int f[MAXN],low[MAXN],dep[MAXN];
- bool flag[MAXN];
- int n,depth,root,father,num;
- vector<int>mapp[MAXN];
- void DFS(int m){ //鎵惧埌鏈€鍒濆浘鐨勫潡鏁?
- int i,u;
- flag[m] = true;
- for(i = 0;i < mapp[m].size(); i++){
- u = mapp[m][i];
- if(!flag[u])
- DFS(u);
- }
- }
- void DFS_CCS(int m){
- int i,u;
- low[m] = dep[m] = depth++;
- flag[m] = true;
- for(i = 0;i < mapp[m].size(); i++){
- u = mapp[m][i];
- if(!flag[u]){
- son ++;
- DFS_CCS(u);
- if(low[u] >= dep[m] && m != father) f[m] ++;
- else if(m == father && son > 1) f[m]++;
- if(low[m] > low[u]) low[m] = low[u];
- }
- else if(low[m] > dep[u]) low[m] = dep[u];
- }
- if(m != father) f[m]++;
- }
- void cal(){
- int i,j;
- num = 0;
- memset(flag,false,sizeof(flag));
- for(i = 0;i < n; i++)
- if(!flag[i]){
- DFS(i);
- num++;
- }
- }
- void cal_ccs(){
- int i,j,son;
- memset(flag,false,sizeof(flag));
- memset(low,0,sizeof(low));
- memset(f,0,sizeof(f));
- memset(dep,0,sizeof(dep));
- depth = 0; num = 0;
- for(i = 0;i < n; i++)
- if(!flag[i]){
- num ++; son = 0;
- father = i;
- DFS_CCS(i);
- }
- }
- int main()
- {
- int i,j,k,m;
- while(scanf("%d%d",&n,&m)){
- if(m == 0 && n == 0)break;
- for(i = 0;i < n; i++) mapp[i].clear();
- while(m--){
- scanf("%d%d",&i,&j);
- mapp[i].push_back(j);
- mapp[j].push_back(i);
- }
- cal();
- cal_ccs();
- int mm = 0;
- for(i = 0;i < n; i++)
- if(f[i] > mm)
- mm = f[i];
- printf("%d/n",mm + num-1);
- }
- }
另一种写法简单些:
* 1)每次DFS时num++,表示图的块数,然后在DFS过程中求出割点并且存下去掉割点 * 连通分量增加的块数,
注意根节点的f[root]最后要-1,因为1个儿子的根节点不 * 会增加图的块数
* 2)找到最大的f[i]和num相加即为所求,但是注意考虑特殊情况,零图
*/
- #include <cstdio>
- #include <cstring>
- #include <vector>
- #define MAXN 10002
- using namespace std;
- int f[MAXN],low[MAXN],dep[MAXN];
- bool flag[MAXN];
- int n,depth,root,father,num,son;
- vector<int>mapp[MAXN];
- void DFS_CCS(int m){
- int i,u;
- low[m] = dep[m] = depth++;
- flag[m] = true;
- for(i = 0;i < mapp[m].size(); i++){
- u = mapp[m][i];
- if(!flag[u]){
- DFS_CCS(u);
- if(low[u] >= dep[m]) f[m] ++;
- if(low[m] > low[u]) low[m] = low[u];
- }
- else if(low[m] > dep[u]) low[m] = dep[u];
- }
- }
- void cal_ccs(){
- int i,j;
- memset(flag,false,sizeof(flag));
- memset(low,0,sizeof(low));
- memset(f,0,sizeof(f));
- memset(dep,0,sizeof(dep));
- depth = 0; num = 0;
- for(i = 0;i < n; i++)
- if(!flag[i]){
- num ++;
- son = 0;
- father = i;
- DFS_CCS(i);
- if(f[father] != 0) f[father]--;
- }
- }
- int main()
- {
- int i,j,k,m;
- while(scanf("%d%d",&n,&m)){
- if(m == 0 && n == 0)break;
- for(i = 0;i < n; i++) mapp[i].clear();
- while(m--){
- scanf("%d%d",&i,&j);
- mapp[i].push_back(j);
- mapp[j].push_back(i);
- }
- cal_ccs();
- if(num == n) printf("%d/n",n-1); //注意考虑零图的情况
- else{
- int mm = 0;
- for(i = 0;i < n; i++)
- if(f[i] > mm)
- mm = f[i];
- printf("%d/n",mm + num);
- }
- }
- }
- TOJ 2299. Electricity【求无向图割点】
- TOJ 2299. Electricity【求无向图割点】
- toj 2299 Electricity 求无向图割点
- TOJ.1026 Network【求无向图割点】
- POJ 2117 Electricity(无向图割点)
- POJ 2117 Electricity(无向图割点)
- POJ 2117 Electricity(无向图割点)
- POJ 2117 Electricity(无向图割点) && HDU 4587 TWO NODES
- POJ 2117 Electricity (无向图求割点)
- poj 2117 Electricity 【无向图求割点】【求去掉一个点后 图中最多的BCC数目】
- poj 2117 Electricity (无向图割点去除后最大连通分支数)
- POJ2117.Electricity——无向图的割点
- TOJ 2189. The Key Stations 【求无向图的割点】
- 【TOJ】2299【POJ】2117.Electricity
- toj 1026 Network 无向图求割点
- 无向图求环路
- 用Tarjan算法求无向连通图割点&&割边
- POJ 1523 SPF Tarjan求无向图割点
- Ubuntu12.04安装hadoop
- TOJ 2217. Invitation Cards【最短路dijkstra+堆优化或者SPFA】
- ZOJ 2674 Strange Limit 欧拉定理
- HDU 4622 多校第三场1002 后缀自动机
- 时间格式转换
- TOJ 2299. Electricity【求无向图割点】
- MFC SDI修改标题
- 高效代码审查的十个经验 .
- iOS 开发中正则表达式
- CF 106E(Space Rescuers-费马点+模拟退火)
- wbin about
- Wiki 1233(太空飞行计划问题-最大权闭合子图)
- 传输线理论
- 用Qt实现窗体的无边框、可移动、透明不规则显示(需背景透明的图片)