poj1144Network(无向图割点数)
2024-08-26 13:37:19
题目大意:给一张无向图,求割点数量。
题目分析:tarjan算法求割点。关于无向图割点,这里说的很清楚了。直接建图跑一遍tarjan算法即可。
详情请见代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 101;
int adj[N][N];
bool flag[N][N],vis[N];
int low[N],dfn[N],subnets[N];
int n,dfns;
char s[N]; void dfs(int cur)
{
int i;
vis[cur] = true;
dfn[cur] = low[cur] = dfns ++;
for(i = 1;i <= adj[cur][0];i ++)
{
if(vis[adj[cur][i]] == false)
{
dfs(adj[cur][i]);
low[cur] = min(low[cur],low[adj[cur][i]]);
if(low[adj[cur][i]] >= dfn[cur])
subnets[cur] ++;
}
else
low[cur] = min(low[cur],dfn[adj[cur][i]]);
}
} void tarjan()
{
int i;
memset(vis,false,sizeof(vis));
memset(subnets,0,sizeof(subnets));
dfns = 1;
for(i = 1;i <= n;i ++)
if(vis[i] == false)
{
subnets[i] --;
dfs(i);
}
int ans = 0;
for(i = 1;i <= n;i ++)
if(subnets[i] > 0)
ans ++;
printf("%d\n",ans);
} int main()
{
int i,j,p;
freopen("in.txt","r",stdin);
while(scanf("%d",&n),n)
{
memset(flag,false,sizeof(flag));
memset(adj,0,sizeof(adj));
while(scanf("%d",&i),i)
{
gets(s);
p = 0;
while(s[p] && s[p] == ' ')
p ++;
while(sscanf(s + p,"%d",&j) == 1)
{
if(flag[i][j] == false)
{
flag[i][j] = flag[j][i] = true;
adj[i][++ adj[i][0]] = j;
adj[j][++ adj[j][0]] = i;
}
while(s[p] && s[p] != ' ')
p ++;
while(s[p] && s[p] == ' ')
p ++;
}
}
tarjan();
}
return 0;
}
//188K 16MS
最新文章
- app使用微信支付成功后,点击返回到该app却跳到另外一个app去了
- XXX esx.problem.syslog.nonpersistent.formatOnHost not found XXX
- Mvc模板页
- bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
- JAVA计算器算法实现
- hdu4267 A Simple Problem with Integers
- 【输入输出挂】【Uva11462】Age Sort
- JavaWeb开发之HttpServletResponse
- 【Centos7 GRUB】修改开机等待时间
- Intervals
- CSS 文本溢出时显示省略标记
- apache tomcat的下载 安装 配置
- DPDK kni创建要先于port开启
- 环境部署(一):Linux下安装JDK
- 【Java编程思想笔记】-集合1
- 问题描述: fatal error: &#39;XCTest/XCTest.h&#39; file not found
- Django_在单独文件中加载Django环境临时调试
- [loss]Triphard loss优雅的写法
- js面向对象设计之class继承
- #leetcode刷题之路39-组合总和