/*
运行时间 :0ms;
运行内存 :220k;
作者:久里克(QQ:71029811)
此题一眼看去有一些简单,但有一些坑点,得要注意点;
坑点,它声明有1000个节点,但是一些节点没有用,就不算网络中的节点; (我中了,并且改了好久的错,才过的)
解题思路:
一个,一个的去掉一个点,再看图有几个连通分量 ,输出就好了;
*/
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const int INF = 1<<28;
const int N = 1005;
typedef struct edge{
int v,w,next;
}edge;
edge e[N];
int cnt;
int head[N]; //采用邻接表存的,不想用邻接矩阵就去存,那样会浪费大量的存储空间和运行时间;
int visit[N];
int node_sum[10000];//记录那么节点被用了;
int cf;
int cntFlag;
int maxNode; //最大的节点是什么;
int trueNode; // 真实有的节点有那几个;
void dfs(int temp,int start){
visit[start] = cntFlag;
int i = head[start];
while(i != 0){
if(!visit[e[i].v] && temp!= e[i].v){
dfs(temp, e[i].v);
}
i = e[i].next;
}
}
//初始化
void init(){
cnt = 1;
cf = 1;
maxNode = 0;
memset(head, 0, sizeof(head));
memset(node_sum, 0, sizeof(node_sum));
}
int main(){
int row,col,temp,sign = 0;
int ca_se = 0;
//这个循环是输入数据, 并标记一些变量;
while(1){
init();
while(1){
scanf("%d",&row);
if(row == 0){
if(cnt == 1){
return 0;
}
break;
};
scanf("%d",&col);
temp = col>row? col:row;
maxNode = maxNode>temp? maxNode:temp;
add(row, col, 1);
add(col, row, 1);
node_sum[row] = node_sum[col] = 1;
}
for(int i=1; i<=maxNode; ++i){
if(node_sum[i] != 0)
++trueNode;
}
printf("Network #%d\n", ++ca_se);
int flag = 0;
//这个循环,是一个一个的去掉一些点,查看这个点是不是割点;
for(int i=1; i<=maxNode; ++i){
for(int j=1; j<=maxNode; ++j){
visit[j] = 0;
}
cntFlag = 1;
cf = i;
if(node_sum[i] == 0)
continue ;
int start = (i+1)%maxNode;
if(start == 0){
start = maxNode;
}
while( node_sum[start] == 0){
start = start+1;
}
dfs(cf, start);
int count = 0;
for(int j=1; j<=maxNode; ++j){
if(visit[j] != 0 && node_sum[j])
++count;
}
if(count != (trueNode-1)){
for(int k=1; k<=maxNode; ++k){
if(visit[k] == 0 && cf != k && node_sum[k]){
++cntFlag;
dfs(cf, k);
}
}
if(cntFlag > 1){
flag = 1;
printf(" SPF node %d leaves %d subnets\n", cf, cntFlag);
}
}
}
if(flag == 0){
printf(" No SPF nodes\n");
}
printf("\n");
}
}
POJ 1523
最新推荐文章于 2019-07-09 23:16:38 发布