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]!='\0';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\n",found); } return 0; }

 

你可能感兴趣的:(NetWork)