连通图
Time Limit:1000MS Memory Limit:65536K
Total Submit:17 Accepted:4
Description
Input
输入:每组数据的第一行是两个整数n 和m(0 < n <=100)。n 表示图的顶点
数目,0 < m <= 100 表示图中边的数目。如果n 为 0 表示输入结束。随后有m 行数据,每
行有两个值x 和y(0 < x , y <=n ),表示顶点x 和y 相连,顶点的编号从1 开始计
算。输入不保证这些边是否重复。
Output
输出:对于每组输入数据,如果所有从1~n所有顶点都是连通的,输出 ’YES’ ,否则输
出 ’NO’。
Sample Input
4 3
1 2
2 3
3 2
3 2
1 2
2 3
0 0
Sample Output
NO
YES
View Code
#include < iostream >
using namespace std;
int n,m;
int a,b;
int i,j;
int flag;
int map[ 101 ][ 101 ];
int used[ 101 ];
void dfs( int x )
{
for ( int p = 1 ; p <= n; p ++ )
if (map[x][p] == 1 && used[p] == 0 )
{
flag ++ ;
used[p] = 1 ;
if (flag == n - 1 ) break ;
if (p <= n && flag < n - 1 ) dfs(p);
p = 1 ; //关键点
}
}
int main()
{
while (cin >> n >> m,n + m)
{
memset(map , 0 , sizeof (map));
memset(used, 0 , sizeof (used));
for (i = 1 ; i <= m; i ++ )
{
cin >> a >> b;
if (a != b) map[a][b] = map[b][a] = 1 ;
}
for (i = 1 ; i <= n ; i ++ )
{
flag = 0 ;
for (j = 1 ; j <= n; j ++ )
{
memset(used, 0 , sizeof (used));
if (map[i][j] == 1 && i != j )
{
flag = 0 ;
used[i] = 1 ; used[j] = 1 ;
flag ++ ;
dfs(j);
if (flag == n - 1 ) break ;
}
}
if (flag == n - 1 ) break ;
}
if (flag == n - 1 ) cout << " YES " << endl;
else cout << " NO " << endl;
}
return 0 ;
}