poj1523赤裸裸的割点

这题真是没什么好说的。。。赤裸裸的求割点直接模板上

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<vector>
 5 #define maxn 1100
 6
 7 using namespace std;
 8
 9 vector<int> g[maxn];
10 int dfn[maxn],low[maxn];
11 int vis[maxn],cnt[maxn];
12 int k=1,f=0,index=0,m;
13 void dfs(int x)
14 {
15  //   cout<<"1"<<endl;
16     int c=0;
17     for(int i=0;i<g[x].size();i++)
18     {
19         int e=g[x][i];
20         if(vis[e]==0)
21         {
22             dfn[e]=low[e]=++index;
23             vis[e]=1;
24             dfs(e);
25             low[x]=min(low[e],low[x]);
26             if(low[e]>=dfn[x])
27             {
28                 cnt[x]++;
29             }
30         }
31         else low[x]=min(low[x],dfn[e]);
32     }
33 }
34 void solve()
35 {
36     f=index=0;
37     memset(dfn,0,sizeof(dfn));
38     memset(cnt,0,sizeof(cnt));
39     memset(vis,0,sizeof(vis));
40     memset(low,0,sizeof(low));
41     printf("Network #%d\n",k++);
42     vis[1]=1;
43     dfn[1]=low[1]=++index;
44     dfs(1);
45     if(cnt[1]>=1) cnt[1]--;
46     for(int i=1;i<=m;i++)
47     {
48         if(cnt[i])
49         {
50             printf("  SPF node %d leaves %d subnets\n",i,cnt[i]+1);
51             f=1;
52         }
53     }
54     if(f==0) printf("  No SPF nodes\n");
55     printf("\n");
56 }
57 int main()
58 {
59     int a,b;
60     while(scanf("%d",&a)!=EOF)
61     {
62         for(int i=1;i<=maxn;i++)
63             g[i].clear();
64         if(a==0) break;
65         scanf("%d",&b);
66         g[a].push_back(b);
67         g[b].push_back(a);
68         m=a<b?b:a;
69         while(1)
70         {
71              int x,y;
72              scanf("%d",&x);
73              if(x==0) break;
74              scanf("%d",&y);
75              g[x].push_back(y);
76              g[y].push_back(x);
77              m=m>x?m:x;
78              m=m>y?m:y;
79         }
80         solve();
81     }
82     return 0;
83 }

时间: 2024-08-24 23:05:06

poj1523赤裸裸的割点的相关文章

POJ1523 SPF(割点)

题目求一个无向图的所有割点,并输出删除这些割点后形成几个连通分量.用Tarjan算法: 一遍DFS,构造出一颗深度优先生成树,在原无向图中边分成了两种:树边(生成树上的边)和反祖边(非生成树上的边). 顺便求出每个结点的DFS序dfn[u] 和 每个结点能沿着它和它的儿子的返祖边达到的结点最小的DFS序low[u]. 一个点是割点当且仅当—— 这个点是生成树的根,且有x(x>=2)个的子树,删除这个点后就形成x个连通分量. 这个点不是树根,且其存在x(x>=1)个儿子的low值小于等于该点的d

POJ1523 SPF【割点】【Tarjan】

题目链接: http://poj.org/problem?id=1523 题目大意: 有一个网络,在这个网络里,电脑之间的通信只能是两台电脑间(点对点)双向通信.如下面左图 所示:如果3号电脑出故障了,那么1号和2号之间.4号和5号之间还可以通信,不过1.2和3.4 号电脑之间就不能通信了,那么3号电脑就是一个SPF节点,且3号电脑故障后,整个网络被分为 了2个子网络.那么问题来了:给你一些边.问删除某个SPF节点后,可以将图分为几个连通分量. 思路: 其实就是给你一个连通图,求出这个连通图的所

POJ-1523 SPF(tarjan求割点)

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

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

poj1523(割点)

这道题是求哪个点是割点,并且能把原图分成几块,add_block数组是求增加的所以还需要加1,然后就是我一直在PE,后来发现需要每输出一组后,有一个空行 #include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int MAXN=1005; const int MAXM=0x3f3f3f; struct edge { int to,next; bool cu

POJ1523SPF[无向图割点]

SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8139   Accepted: 3723 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

POJ 1523 SPF 割点与桥的判断算法-Tarjan

题目链接: POJ1523 题意: 问一个连通的网络中有多少个关节点,这些关节点分别能把网络分成几部分 题解: Tarjan 算法模板题 顺序遍历整个图,可以得到一棵生成树: 树边:可理解为在DFS过程中访问未访问节点时所经过的边,也称为父子边 回边:可理解为在DFS过程中遇到已访问节点时所经过的边,也称为返祖边.后向边 对根节点u,若其有两棵或两棵以上的子树,则该根结点u为割点: 对非叶子节点u(非根节点),若其子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与u的子树的节点不再

POJ-1523-SPF(求割点)

链接: https://vjudge.net/problem/POJ-1523#author=0 题意: 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 failure of a single node, 3, in the network on

BZOJ 2730:[HNOI2012]矿场搭建(割点+连通块)

[HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口.请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数.Input 输入文件有若干组数据,每组数据的第一行是一个正整数 N(N≤500),表示工地的隧道数,接下来的 N 行每行是用空