zoj 1119 /poj 1523 SPF

题目描述:
考虑图8.9中的两个网络,假定网络中的数据只在有线路直接连接的2个结点之间以点对点
的方式传输。一个结点出现故障,比如图(a)所示的网络中结点3出现故障,将会阻止其他某些结
点之间的通信。结点1和结点2仍然是连通的,结点4和结点5也是连通的,但这2对结点之间
的通信无法进行了。因此结点3是这个网络的一个SPF结点。
严格的定义:对于一个连通的网络,如果一个结点出现故障,将会阻止至少一对结点之间的
通信,则该结点是SPF结点。
注意,图所示的网络不存在SPF结点。至少两个结点出现故障后,才会使得其他某对
结点之间无法通信。
输入描述:
输入文件包含多个测试数据,每个测试数据描绘了一个网络。每个网络的数据包含多对整数,
每对整数占一行,表示两个直接连接的结点。结点对中两个结点的顺序是无关的,1 2和2 1表示
同一对连接。结点序号范围为1~1000,每个网络的数据中最后一行为一个0,表示该网络数据
的结束。整个输入文件最后一行为一个0,代表输入结束。读入时需要忽略输入文件中的空行。
图 SPF结点
输出描述:
对输入文件中的每个网络,首先输出该网络在输入文件中的序号,然后是该网络中的SPF结
点。具体格式为:第一个网络的序号为"Network #1",第二个网络的序号为"Network #2",等等。
对网络中的每个SPF结点,输出占一行,输出格式如样例输出所示,输出信息标明SPF结点的
序号及该SPF结点出现故障后将整个网络分成几个连通的子网络。如果网络中不存在SPF结点,
则只输出"No SPF nodes"。每两个网络的输出之间,输出一个空行。

// 求无向图连通图的割点 以及 去掉该割点后图分成几个连通块
// Tarjan 算法的应用
#include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> using namespace std; #define MOD 1000000007 #define maxn 1010 bool G[maxn][maxn]; int low[maxn],pre[maxn]; int ans[maxn]; int dfst; int node; int child; void init(){ dfst=0; node=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]++; else child++; } } else lowu=min(lowu,pre[v]); } } return lowu; } int main() { int u,v; int Case=0; while(scanf("%d",&u),u){ init(); scanf("%d",&v); node=max(u,v); G[u][v]=G[v][u]=1; while(scanf("%d",&u),u){ scanf("%d",&v); node=max(node,v); node=max(node,u); G[u][v]=G[v][u]=1; } dfs(1); int found=0; if(child>1) ans[1]=child-1; if(Case) printf("\n"); printf("Network #%d\n",++Case); for(int i=1;i<=node;i++) if(ans[i]){ found=1; printf(" SPF node %d leaves %d subnets\n",i,ans[i]+1); } if(!found) printf(" No SPF nodes\n"); } return 0; }

 

posted on 2013-07-21 11:17  江财小子  阅读(240)  评论(0编辑  收藏  举报