【POJ1523】SPF tarjan求点-双连通分量 裸题模板题

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42671865

其实我就是觉得原创的访问量比未授权盗版多有点不爽233。。。

题意:求哪些点是割点,割掉以后能把图分成几块。

太水不欲发题解。

tarjan就好,不懂看代码。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1005
using namespace std;
int map[N][N];
bool exist[N];
int dfn[N],low[N],cnt;
int stk[N],top;
int d[N];
void init()
{
	memset(d,0,sizeof(d));
	memset(dfn,0,sizeof(dfn));
	memset(map,0,sizeof(map));
	memset(exist,0,sizeof(exist));
	cnt=top=0;
}
void tarjan(int x,int p)
{
	int v,temp;
	dfn[x]=low[x]=++cnt,stk[++top]=x;
	for(v=1;v<=1000;v++)if(map[x][v]&&v!=p)
	{
		if(!dfn[v])
		{
			tarjan(v,x);
			low[x]=min(low[x],low[v]);
			if(dfn[x]<=low[v])
			{
				do{
					temp=stk[top--];
					d[temp]++;
				}while(temp!=x);top++;
			}
		}
		else low[x]=min(low[x],dfn[v]);
	}
	return ;
}

int main()
{
	int i,T=0;
	int a,b;
	while(scanf("%d",&a),a)
	{
		init();
		int flag=1;
		printf("Network #%d\n",++T);

		do{
			scanf("%d",&b);
			map[a][b]=map[b][a]=1;
			exist[a]=exist[b]=true;
		}while(scanf("%d",&a),a);

		for(i=1;i<=1000;i++)if(exist[i]&&!dfn[i])tarjan(i,0);
		for(i=1;i<=1000;i++)if(d[i]>=2)
			printf("  SPF node %d leaves %d subnets\n",i,d[i]),flag=0;
		if(flag)puts("  No SPF nodes");
		puts("");
	}
	return 0;
}
时间: 2024-10-09 17:56:26

【POJ1523】SPF tarjan求点-双连通分量 裸题模板题的相关文章

【POJ3352】Road Construction tarjan求边-双连通分量,裸题模板题

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42671851 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 裸题只给模板. tarjan可以实现. 太水不发题解. 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 1010 #define M 202

bzoj1123 BLO tarjan求点双连通分量

填坑--链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1123 题意:问切断第i个点之后多少对点不再联通. 就是个求割点同时计算出双连通分量大小嘛-- 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=10000

Tarjan求点双连通分量

概述 在一个无向图中,若任意两点间至少存在两条"点不重复"的路径,则说这个图是点双连通的(简称双连通,biconnected) 在一个无向图中,点双连通的极大子图称为点双连通分量(简称双连通分量,Biconnected Component,BCC) 性质 任意两点间至少存在两条点不重复的路径等价于图中删去任意一个点都不会改变图的连通性,即BCC中无割点 若BCC间有公共点,则公共点为原图的割点 无向连通图中割点一定属于至少两个BCC,非割点只属于一个BCC 算法 在Tarjan过程中维

POJ-1523 SPF(tarjan求割点)

题目链接:http://poj.org/problem?id=1523 题目大意:有多组数据,要你求出每组数据的割点,并输出这个割点所在的块数 算法实现: 割点是什么:一个无向连通图去掉一个点及与这个点相连的后,这个无向图分为多个互不连通的子块,这个点则称为割点 时间戳是什么:在搜索时访问的最早时间 算法:tarjan算法 维护dfn[u]表示u的时间戳 low[u]表示u点所能回到的最早的祖先的时间戳 cut[u]表示u点所属于的块的数量 判断割点的条件  dfn[u]>=low[v]  //

poj 3352 求 边-双连通分量

[题意] 给出一张无向连通图,求至少连几条边可以变成边双连通图 [思路]求出边-双连通分量,缩点就成了一棵树,求这棵树里的出度为1 的点num  结果是(num-1)/2; 1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<stack> 5 #include<vector> 6 using namespace std; 7 int pre[1002],

POJ1523 SPF 【求割点Tarjan】

SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6131   Accepted: 2814 Description Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a

tarjan算法求桥双连通分量 POJ 3177 Redundant Paths

POJ 3177 Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12598   Accepted: 5330 Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the re

【BZOJ3331】[BeiJing2013]压力 Tarjan求点双

[BZOJ3331][BeiJing2013]压力 Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量.他们每天都生活在巨大的压力之下. 小强建立了一个模型.这世界上有N个网络设备,他们之间有M个双向的链接.这个世界是连通的.在一段时间里,有Q个数据包要从一个网络设备发送到另一个网络设备. 一个网络设备承受的压力有多大呢?很显然,这取决于Q个数据包各自走的路径.不过,某些数据包无论走什么路径都不可避免的要通过

Tarjan 求强连通分量刘汝佳模板

1 vector<int> G[MAXN]; 2 int pre[MAXN], lowlink[MAXN], sccno[MAXN], dfs_clock, scc_cnt; 3 stack<int> S; 4 void Tarjan(int u) 5 { 6 pre[u] = lowlink[u] = ++dfs_clock; 7 S.push(u); 8 for (int i = 0; i < G[u].size(); ++i) { 9 int v = G[u][i];