• ZOJ1311, POJ1144 Network


    题目描述:
    TLC电话线路公司正在新建一个电话线路网络。他们将一些地方(这些地方用1到N的整数
    标明,任何2个地方的标号都不相同)用电话线路连接起来。这些线路是双向的,每条线路连接
    2个地方,并且每个地方的电话线路都是连接到一个电话交换机。每个地方都有一个电话交换机。
    从每个地方都可以达到其他一些地方(如果有线路连接的话),然而这些线路不一定必须是直接连
    接的,也可以是通过几个电话交换机到达另外一个地方。但是有时会因为电力不足导致某个地方
    的交换机不能工作。TLC的官员意识到一旦出现这种情况(在某个地方的交换机不工作,即这个
    结点与其他结点之间的线路都断开了),除了这个出现故障的地方是不可达外,还可能导致其他一
    些(本来连通的)地方也不再连通。称这个地方为关节点。
    现在TLC的官员努力想写一个程序来找到关节点的数目。请帮助他们。

    // 求连通图 割点的个数 继续tarjan了

    #include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> using namespace std; #define MOD 1000000007 #define maxn 110 bool G[maxn][maxn]; int low[maxn],pre[maxn]; bool ans[maxn]; int dfst; int node; int child; void init(){ dfst=0; child=0; memset(G,0,sizeof(G)); memset(ans,0,sizeof(ans)); memset(pre,0,sizeof(pre)); } int dfs(int u){ int lowu; lowu=pre[u]=++dfst; int v; for(v=1;v<=node;v++){ if(G[u][v]){ if(!pre[v]){ int lowv=dfs(v); lowu=min(lowu,lowv); if(lowv>=pre[u]){ if(u!=1) ans[u]=true; else child++; } } else lowu=min(lowu,pre[v]); } } return lowu; } void deal(char *str,int u){ int t=0,v; int i; for(i=0;str[i]!='';i++){ if(str[i]>='0'&&str[i]<='9') { t=t*10+str[i]-'0'; } else { if(t){ v=t; G[u][v]=G[v][u]=true; } t=0; } } if(t){ v=t; v=t; G[u][v]=G[v][u]=true; } } int main() { int u; char str[1010]; while(scanf("%d",&node),node){ init(); while(scanf("%d",&u),u){ gets(str); deal(str,u); } //for() dfs(1); int found=0; if(child>1) ans[1]=true; for(int i=1;i<=node;i++) if(ans[i]) found++; printf("%d ",found); } return 0; }
  • 相关阅读:
    Win7系统下搭建Tomcat服务器
    转:在线框架引用 bootstrap/jq/jqmobile/css框架
    转:Web.config配置文件详解
    转:HTML和Web窗体的区别
    在VS2010中创建网站并发布
    nohup 借助cronolog进行日志分割 Linux
    Linux (centos 8) 安装nginx1.20
    Ubuntu 安装使用yum--转载
    C# 字符串插值内部工作原理
    Linux 安装MySQL
  • 原文地址:https://www.cnblogs.com/372465774y/p/3203752.html
Copyright © 2020-2023  润新知