POJ 1523 网络连通

题目大意:

给你一个网络组,每台机子与其他机子的关系,让你找到所有的割点,如果没有割点,输出无

这道题目就是最直接的求割点问题,我在这里用的是邻接矩阵来存储机子之间的关系

割点问题的求解需要对深度优先搜索序数有比较好的理解

dfn[]用于存储当前的优先搜索序数,low[]存储当前点通过子节点或是回路所能达到的最小优先搜索序数

当(u,v)一组边dfn[u]<=low[v]时,那么u就是一个割点(这是u不作为树的顶点时的情况)

u作为顶点时,也即dfn[u]==1时,要看u的儿子节点数,大于等于2个时也说明它是割点

总体代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 1002
#define min(a,b) a<b?a:b;
#define max(a,b) a>b?a:b;
int edge[N][N],low[N],dfn[N],subnets[N],son,visit[N],tmpdfn,n,flag;//flag标志这个图是否能找到割点

void init()
{
    memset(visit,0,sizeof(visit));
    memset(subnets,0,sizeof(subnets));
    visit[1]=1,low[1]=1,dfn[1]=1,son=0,tmpdfn=1;
}
void dfs(int u)//dfs函数要进行递归,所以不在里面进行初始化操作
{
    for(int i=1;i<=n;i++){
        if(edge[u][i]){
            if(!visit[i]){
                tmpdfn++;
                visit[i]=1;
                low[i]=dfn[i]=tmpdfn;
                dfs(i);
                low[u]=min(low[u],low[i]);//回退的时候,找祖先节点u能达到的较小的low值
                if(low[i]>=dfn[u]){
                    if(u!=1) subnets[u]++;
                    else son++;
                }
            }
            else low[u]=min(low[u],dfn[i]);//这时候i是u的祖先节点,且这是一条回边
        }
    }
}
int main()
{
    int u,v,cnt=0;
    while(scanf("%d",&u)&&u!=0){
        flag=0,n=0;
        cnt++;//来统计网络个数
        scanf("%d",&v);
        n=max(n,u);
        n=max(n,v);
        memset(edge,0,sizeof(edge));
        edge[u][v]=1,edge[v][u]=1;
        while(scanf("%d",&u)&&u!=0){
            scanf("%d",&v);
            n=max(n,u);
            n=max(n,v);
            edge[u][v]=1,edge[v][u]=1;
        }
        printf("Network #%d\n",cnt);
        init();
        dfs(1);
        if(son>1) subnets[1]=son-1;
        for(int i=1;i<=n;i++){
            if(subnets[i]){
                flag=1;
                printf("  SPF node %d leaves %d subnets\n",i,subnets[i]+1);
            }
        }
        if(flag==0) printf("  No SPF nodes\n");
        printf("\n");
    }
    return 0;
}

POJ 1523 网络连通

时间: 2024-10-11 22:06:23

POJ 1523 网络连通的相关文章

SPF(poj 1523) 割点入门

1 /***************************************** 2 SPF(poj 1523) 3 割点入门 4 http://poj.org/problem?id=1523 5 6 ******************************************/ 7 8 #include<iostream> 9 #include<algorithm> 10 #include<cstdio> 11 #include<cstring&

Server 2012 R2 - Hyper-V 中Liunx网络连通设置

第一步: 完成"新建虚拟机"后不要启动该虚拟机: 第二步: 选中已建好的虚拟机右键"设置" 第三步: 选中"网络适配器"并"移除"和"确定" 第四步: 点选"添加硬件"选择"旧版网络适配器"并点击"添加"确定 第五步: 正常安装"Liunx虚拟机"至登录"Liunx界面" 第六步: 编辑网卡参数,修改为&qu

POJ 1523 SPF(强连通分量求割点)

题目地址:POJ 1523 这题猛的一看..貌似有点难的样子.不过仔细一想,那个每个割点所分成一次子图不就都能找到这个割点一次吗,那么只要记录下它作为割点的次数再+1不就行了.也算是求割点的裸题吧.这个题的输出很坑...需要注意一下.. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #incl

POJ 1523

无向图求割点模板题 1 #include <iostream> 2 #include <cstdio> 3 #include <string.h> 4 using namespace std; 5 const int N=1002; 6 7 int subnets[N]; 8 int dfn[N],low[N]; 9 int count,mun,son,ks; 10 11 bool map[N][N]; 12 bool vis[N]; 13 14 void init()

实现网络连通检测的五种方法

方法一: windows下调用icmp.dll库,实现ping连通检测,缺点是不能跨平台,受限于icmp.dll库: // windows下调用icmp.dll库实现网络连通检测示例代码 #include <Winsock2.h> #include <iphlpapi.h> #include <stdio.h> #pragma comment(lib,"Iphlpapi.lib") #pragma comment(lib,"Ws2_32.l

poj 1523 SPF【点双连通求去掉割点后bcc个数】

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

SPF http://poj.org/problem?id=1523 Time Limit: 1000MS   Memory Limit: 10000K       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 fail

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

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

如何配置IP地址及网段,如何测试网络连通,如何通过NUC路径访问

这篇跟大家分享一点知识内容,这一篇总共三个内容.内容一:配置IP地址及网段内容二:测试网络的连通内容三:通过unc路径访问 我们在这之前要准备一个虚拟机然后打开两台win10虚拟客户机(我用的是server服务器跟win10,这并没有差别)具体步骤如下:内容一 我们保证两台虚拟机的网段是同一个网段,在虚拟机的右下角点开小电脑图标,进入配置界面然后选自定义随便选择一个网段(但是两个虚拟机的网段要相同)另一台虚拟机也是一样的配置网段,然后确定配置网段完毕后我们在桌面上点击鼠标右键打开网络图标属性,点