求割点 poj 1523
2024-09-21 03:04:32
给你一些双向边 求有多少个割点 并输出去掉点这个点 去掉后有几个联通分量
Tarjan
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<math.h> using namespace std; #define MAXN 1000
int head[MAXN+],dfn[MAXN+],low[MAXN+],z[MAXN+];
int cnt,num; struct edg
{
int to,next; }x[]; void add(int u,int v)
{
x[cnt].next=head[u];
x[cnt].to=v;
head[u]=cnt++;
}
void dfs(int u,int k)
{
int i;
dfn[u]=low[u]=k;
for(i=head[u];i!=-;i=x[i].next)
{
if(!dfn[x[i].to]) //没访问过 x[i].to孩子节点
{
dfs(x[i].to,k+);
low[u]=min(low[u],low[x[i].to]);
if(low[x[i].to]>=dfn[u]) //不能跳过这个点 去掉后 必然多一个
z[u]++;
}
else
low[u]=min(low[u],dfn[x[i].to]); //访问过 x[i].to 是父亲节点
}
}
int main()
{
int n,m,ca,m1;
ca=; while(scanf("%d",&n)!=EOF&&n)
{
m1=;
memset(head,-,sizeof(head));
memset(z,,sizeof(z));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
scanf("%d",&m);
m1=max(n,m);
add(n,m),add(m,n); int a,b;
while(scanf("%d",&a)!=EOF&&a)
{
scanf("%d",&b);
m1=max(m1,a);
m1=max(m1,b);
add(a,b),add(b,a);
}
dfs(,); /考虑 1 是根 数组搞出来要减1
z[]--;
if(ca!=)
printf("\n");
printf("Network #%d\n",ca++);
int ok=; for(int i=;i<=m1;i++)
{
if(z[i]>)
{
printf(" SPF node %d leaves %d subnets\n",i,z[i]+); 去掉该点以下的联通分量 上面还有一半
ok=;
}
}
if(ok==)
printf(" No SPF nodes\n");
} return ;
}
/*
Network #1
SPF node 3 leaves 2 subnets
*/
最新文章
- mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法!
- ajax跨域往php程序post数据时,php程序总是执行两次的解决方法
- 【jQuery EasyUI系列】创建CRUD数据网格
- JavaIO中的Reader和writer
- Oracle插入时间
- 在centos6.3用yum安装redis
- 针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
- 转: 58同城高性能移动Push推送平台架构演进之路
- python(一)入门
- [PWA] 16. Clean IDB
- poj3620
- [XMPP]iOS聊天软件学习笔记[三]
- 为TL-WR720N编译带mentohust和njit-client的openwrt固件
- 系列五AnkhSvn
- JS---控制键盘事件
- 用户体验 | 寻找成套的 App SDK 服务
- LOJ #116 有源汇点有上下界的最大流
- 【Linux】Rsync的剖析与使用
- mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
- vue的搭建项目