POJ 1523

/*
	运行时间 :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");
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值