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;
}