(连通图 模板题 无向图求割点)Network --UVA--315(POJ--1144)
链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=251
http://poj.org/problem?id=1144
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82833#problem/B
首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define maxn 10005 int dfn[maxn];///代表最先遍历到这个点的时间
int low[maxn];///这个点所能到达之前最早的时间点
int Father[maxn];///保存这个节点的父亲节点
int n, m, Time, top;///Time 时间点, top用于栈操作
vector<vector<int> > G; void Init()
{
G.clear();
G.resize(n+);
memset(low, , sizeof(low));
memset(dfn, , sizeof(dfn));
memset(Father, , sizeof(Father));
Time = ;
} void Tarjan(int u,int fa)
{
low[u] = dfn[u] = ++Time;
Father[u] = fa;
int len = G[u].size(), v; for(int i=; i<len; i++)
{
v = G[u][i]; if(!dfn[v])
{
Tarjan(v, u);
low[u] = min(low[u], low[v]);
}
else if(fa != v)///假如我们在这里写上了 low[u] = min(low[v], low[u]),那么就相当于我们由v回到了v之前的节点
low[u] = min(dfn[v], low[u]);
}
}
void solve()
{/**
求割点
一个顶点u是割点,当且仅当满足(1)或(2)
(1) u为树根,且u有多于一个子树。
(2) u不为树根,且满足存在(u,v)为树枝边(或称 父子边,即u为v在搜索树中的父亲),使得 dfn(u)<=low(v)。
(也就是说 V 没办法绕过 u 点到达比 u dfn要小的点)
注:这里所说的树是指,DFS下的搜索树*/
int RootSon = , ans = ;///根节点儿子的数量
bool Cut[maxn] = {false};///标记数组,判断这个点是否是割点 Tarjan(,); for(int i=; i<=n; i++)
{
int v = Father[i];
if(v == )///也是就说 i的父亲是根节点
RootSon ++;
else if(dfn[v] <= low[i])
Cut[v] = true;
} for(int i=; i<=n; i++)
{
if(Cut[i])
ans ++;
}
if(RootSon > )
ans++; printf("%d\n", ans);
}
int main()
{
while(scanf("%d", &n), n)
{
int a, b;
char ch;
Init();
while(scanf("%d", &a), a)
{
while(scanf("%d%c",&b,&ch))
{
G[a].push_back(b);
G[b].push_back(a);
if(ch == '\n')
break;
}
}
solve();
}
return ;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std; #define N 105 struct Edage
{
int v, next;
} e[N*N]; int n, m, Index, ans;
int low[N], dfn[N], father[N], Head[N]; void Init()
{
ans = Index = ;
memset(low, , sizeof(low));
memset(dfn, , sizeof(dfn));
memset(father, , sizeof(father));
memset(Head, -, sizeof(Head));
}
void Add(int u, int v)
{
e[ans].v = v;
e[ans].next = Head[u];
Head[u] = ans++;
}
void Tarjan(int u, int fa)
{
int v;
low[u] = dfn[u] = ++Index;
father[u] = fa; for(int j=Head[u]; j!=-; j=e[j].next)
{
v = e[j].v;
if(!dfn[v])
{
Tarjan(v, u);
low[u] = min(low[u], low[v]);
}
else if(v!=fa)
low[u] = min(low[u], dfn[v]);
}
} void Slove()
{
int sum=, bnt=;
bool Cut[N]= {false}; Tarjan(, ); for(int i=; i<=n; i++)
{
int v = father[i];
if(v==)
sum++;
else if(dfn[v]<=low[i])
Cut[v] = true;
} for(int i=; i<=n; i++)
{
if(Cut[i])
bnt ++;
} if(sum>)
bnt ++; printf("%d\n", bnt);
} int main()
{
while(scanf("%d", &n), n)
{
int u, v;
char ch; Init();
while(scanf("%d", &u), u)
{
while()
{
scanf("%d%c", &v, &ch);
Add(u, v);
Add(v, u);
if(ch=='\n')
break;
}
} Slove();
}
return ;
}
(连通图 模板题 无向图求割点)Network --UVA--315(POJ--1144)的更多相关文章
- (连通图 模板题 无向图求桥)Critical Links -- UVA -- 796
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 315 Network (模板题)(无向图求割点)
<题目链接> 题目大意: 给出一个无向图,求出其中的割点数量. 解题分析: 无向图求割点模板题. 一个顶点u是割点,当且仅当满足 (1) u为树根,且u有多于一个子树. (2) u不为树根 ...
- uva 315 Network(无向图求割点)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 无向图求割点 UVA 315 Network
输入数据处理正确其余的就是套强联通的模板了 #include <iostream> #include <cstdlib> #include <cstdio> #in ...
- B - Network - uva 315(求割点)
题意:给一个无向连通图,求出割点的数量. 首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束(很蛋疼的输入方式). 分析:割点的模板题 ...
- poj 1144 Network 无向图求割点
Network Description A Telephone Line Company (TLC) is establishing a new telephone cable network. Th ...
- 连通分量模板:tarjan: 求割点 && 桥 && 缩点 && 强连通分量 && 双连通分量 && LCA(近期公共祖先)
PS:摘自一不知名的来自大神. 1.割点:若删掉某点后.原连通图分裂为多个子图.则称该点为割点. 2.割点集合:在一个无向连通图中,假设有一个顶点集合,删除这个顶点集合,以及这个集合中全部顶点相关联的 ...
- 2013 ACM/ICPC南京邀请赛B题(求割点扩展)
题目链接:http://icpc.njust.edu.cn/Contest/194/Problem/B B - TWO NODES 时间限制: 10000 MS 内存限制: 65535 KB 问题描述 ...
- B - Network---UVA 315(无向图求割点)
A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connectin ...
随机推荐
- Haskell语言学习笔记(62)Divisible
Divisible class Contravariant f => Divisible f where divide :: (a -> (b, c)) -> f b -> f ...
- idea下maven项目打包
近使用idea运行maven需要打包上传tomcat服务器.但是网上一直零零碎碎的....自己记录一下.以防后面忘记 1.idea中.file →Project Structure(快捷键Ctrl+S ...
- 真机IOS8.3以上的文件夹共享
ios8.3以上的版本,苹果规定需要验证身份,将不在默认开启文件共享,但是在实际测试工作中,提取文件是经常需要做的操作,笔者在使用GT采集性能数据后,通过itoos或itunes都无法获得目标app的 ...
- Web服务技术协议:REST与SOAP
Web服务技术就有SOAP(Simple Object Access Protocol,简单对象访问协议)和REST(Representational State Transfer,表示性状态转移) ...
- Drying
Drying http://poj.org/problem?id=3104 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 2 ...
- ios 进入后台 一段时间在进入前台 动画消失
http://www.cnblogs.com/YouXianMing/p/3670846.html
- 查找ipa包,删除接的ipa包
- MongoDB安装(一)
详细图解,记录 win7 64 安装mongo数据库的过程.安装的版本是 MongoDB-win32-x86_64-2008plus-ssl-3.4.1-signed. 示例版本:mongodb-wi ...
- docker搭建nginx
在Docker下部署Nginx,包括: 部署一个最简单的Nginx,可以通过端口访问默认的网站 设置记录访问和错误日志的路径 以交互模式创建centos容器,如果本地没有镜像,会从仓库获取, 等待即可 ...
- 利用redis完成自动补全搜索功能(三)
前面已经完成了分词和自动提示功能,最后把搜索结合在一起,来个完成的案例.当然最好还是用搜索分词解决,这个只是一个临时解决方案. 其实加上搜索很简单,要做的就是3件事 1. 分词的时候,把有用词的id存 ...