连通图

连通图

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

 

 

 

  
15103756_rjYM.gif15103756_Mg0I.gifView 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 ;
}

转载于:https://my.oschina.net/garyun/blog/602890

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值