POJ 1523 割點

   比較裸的割點,多了個求割點的度,注意輸入輸出格式

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cassert>
#include <algorithm>
using namespace std ;

const int N = 1000 + 11 ;

struct Greaph {
	struct Edge {
		int e ;
		int next ;
	};

	Edge err[N<<4] ; int head[N] ; int idx ;
	int instack[N] ; int dfn[N] ; int low[N] ; int visit_time ; int color ;
	vector<int> stk ;
	int degree[N] ;
	vector<pair<int , int> > que ;

    void add_edge(int a , int b) {
		err[idx].e = b ;
		err[idx].next = head[a] ;
		head[a] = idx ++ ;
	}

	void init() {
		memset(head , -1 , sizeof(head)) ;
		memset(instack , 0 ,sizeof(instack)) ;
		memset(degree , 0 , sizeof(degree)) ;
		visit_time = 0 ,color = 2 , idx = 1 ;
		stk.clear() ;
		que.clear() ;
	}

	void dfs(int u , int fa) {
		stk.push_back(u) ;
		instack[u] = 1 ;
		dfn[u] = low[u] = ++visit_time ;
		for(int i = head[u] ; i != -1 ; i = err[i].next) {
			int e = err[i].e ;
			if(e == fa) continue ;
			if(instack[e] == 0) {
				++degree[e] ;
				dfs(e , u) ;
				if(low[e] >= dfn[u]) ++degree[u] ;
				low[u] = min(low[u] , low[e]) ;
			}else if(instack[e] ==  1) {
				low[u] = min(low[u] , dfn[e]) ;
			}
		}
		if(low[u] == dfn[u]) {
			int tmp  ;
			while(stk.back() != u) {
				tmp = stk.back() ;
				stk.pop_back() ;
				instack[tmp] = 2 ;
			}
			stk.pop_back() ;
			instack[tmp] = 2 ;
		}
		if(degree[u] > 1) que.push_back(make_pair(u , degree[u])) ;
	}

	void std_fun() {
		dfs(1 , 0) ;
		if(que.size() == 0) {
			printf("  No SPF nodes\n") ;
			return ;
		}
		sort(que.begin() , que.end()) ;
		for(int i = 0 ; i < que.size() ; ++i) {
			pair<int ,int> tmp = que[i] ;
			printf("  SPF node %d leaves %d subnets\n" , tmp.first , tmp.second) ;
		}
	}
}g ;

int main() {
	int a , b ;
	int t = 1 ;
	g.init() ;
	while(scanf("%d%d" ,&a ,&b) == 2 ) {
		if(a == 0) {
			printf("Network #%d\n" ,t++) ;
			g.std_fun() ;
			if(b == 0) break ;
			printf("\n");
			g.init() ;
			a = b;
			scanf("%d" ,&b) ;
		}
		g.add_edge(a , b) ;
		g.add_edge(b , a) ;
	}
}


發佈了48 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章