判断无向图是否连通,求图的直径

hdoj 1869 六度分离

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

int n, m, cnt;
int mp[102][102], Min[102];
bool mark[102];


void dfs( int a ) {
	int i;
	mark[a] = 1;
	cnt ++;
	for( i=0; i<n; ++i ) {
		if( mp[a][i] && !mark[i] ) dfs(i);
	}
}



int findFarthest( int u ) {
	queue<int> Q;
	int i, j, v, m;
	for( i=0; i<n; ++i ) {
		mark[i] = 0;
		Min[i] = 999999;
	}

	Min[u] = 0;
	Q.push(u);
	mark[u] = 1;
	while( !Q.empty() ) {
		u = Q.front();
		Q.pop();
		for( i=0; i<n; ++i ) {
			if( mp[u][i] && Min[i] > Min[u] + 1 ) {
				Min[i] = Min[u] + 1;
				if( !mark[i] ) Q.push(i);
			}
		}
	}
	
	v = 0;
	for( i=1; i<n; ++i ) {
		if( Min[i] > Min[v] ) v = i;
	}
	return v;
}



int solve() {
	int a, b, c, i, j;
	cnt = 0;
	memset( mark, 0, sizeof(mark) );
	dfs(0);
	if( cnt < n ) return 0;

	a = findFarthest(0);
	b = findFarthest(a);
	return Min[b] <= 7;
}



int main() {
//	freopen( "c:/aaa.txt", "r", stdin );
	int a, b, ans;
	while( scanf("%d %d", &n, &m) == 2 ) {
		memset(mp, 0, sizeof(mp));
		while( m -- ) {
			scanf( "%d %d", &a, &b );
			mp[a][b] = mp[b][a] = 1;
		}

		ans = solve();
		ans == 1 ? puts( "Yes" ) : puts( "No" );
	}
	return 0;
}


posted on 2011-02-17 19:49  CrazyAC  阅读(4006)  评论(0)    收藏  举报