您的位置:首页 > 其它

ZOJ1119(SPF)

2016-05-21 15:58 344 查看
题目链接:传送门

题目大意:一副无向图,问有多少个节点满足删除该节点后图不连通,对于每个满足条件的节点,输出节点编号及删除节点将图分为几个连通块。若没有节点满足则输出No SPF nodes

题目思路:tarjan算法求关节点入门题(也可用矩阵存图)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
#define Min(x,y) (x<y?x:y)
#define Max(x,y) (x>y?x:y)
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 100000007
#define inf 0x3f3f3f3f
#define N 1000005
#define maxn 1000050
typedef long long LL;
typedef pair<int,int> PII;

int n,m,head[1001],hcnt,son,num;
int dfn[1001],low[1001],area[1001],vis[1001];
int deep;
struct Node{
int to,next;
Node(){}
Node(int a,int b):to(a),next(b){}
}node[2000800];
inline void add(int x,int y){
node[hcnt]=Node(y,head[x]);
head[x]=hcnt++;
}

void init(){
num=0;  ///最大节点的编号
hcnt=0;
deep=1; ///深度搜索树的深度优先数(第几个被搜索)
son=0;  ///记录根节点的子女个数
low[1]=dfn[1]=1;  ///low表示节点能通过子女和回边到达的最小深度优先数
mst(head,-1);     ///dfn表示节点的深度优先数
mst(vis,0);
mst(area,0);  ///记录删除某个节点后图被分成了几块
vis[1]=1; ///标记节点是否访问过
}

void dfs(int x){
for(int i=head[x];~i;i=node[i].next){
int e=node[i].to;
if(vis[e]) low[x]=Min(low[x],dfn[e]);
else{
vis[e]=1;
dfn[e]=low[e]=++deep;
dfs(e);
low[x]=Min(low[x],low[e]);
if(low[e]>=dfn[x]){
if(x==1) ++son;
else ++area[x];
}
}
}
}

int main(){
int i,j,group,Case=0,x,y;
while(scanf("%d",&x)!=EOF&&x){
init();
num=Max(num,x);
scanf("%d",&y);
num=Max(num,y);
add(x,y);
add(y,x);
while(scanf("%d",&x)&&x){
num=Max(num,x);
scanf("%d",&y);
num=Max(num,y);
add(x,y);
add(y,x);
}
if(Case)printf("\n");
printf("Network #%d\n",++Case);
dfs(1);
if(son>1)area[1]=son-1;
int flag=0;
for(i=1;i<=num;++i)if(area[i]){
flag=1;
printf("  SPF node %d leaves %d subnets\n",i,area[i]+1);
}
if(!flag) printf("  No SPF nodes\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: