HDU1272+BFS

题意就是要求给定的一张图是否是棵树。。。

BFS一遍即可+树的特征。

有一组BT数据。。。

View Code
  1 /*

  2 

  3 */

  4 #include<stdio.h>

  5 #include<string.h>

  6 #include<stdlib.h>

  7 #include<algorithm>

  8 #include<iostream>

  9 #include<queue>

 10 #include<vector>

 11 #include<map>

 12 #include<math.h>

 13 typedef long long ll;

 14 //typedef __int64 int64;

 15 const int maxn = 100005;

 16 const int maxm = 1005;

 17 const int inf = 0x7FFFFFFF;

 18 const double pi = acos(-1.0);

 19 const double eps = 1e-8;

 20 using namespace std;

 21 int vis[ maxn ];

 22 struct node{

 23     int u,next;

 24 }edge[ maxn<<2 ];

 25 int cnt ,head[ maxn ];

 26 int v[ maxn ];

 27 

 28 void init(){

 29     cnt = 0;

 30     memset( head,-1,sizeof( head ));

 31     memset( vis,0,sizeof( vis ) );

 32 }

 33 

 34 void addedge( int a,int b ){

 35     edge[ cnt ].u = b;

 36     edge[ cnt ].next = head[ a ];

 37     head[ a ] = cnt++;

 38 }

 39 

 40 bool bfs( int st,int sum ){

 41     memset( vis,0,sizeof( vis ) );

 42     queue<int>q;

 43     q.push( st );

 44     vis[st] = 1;

 45     while( !q.empty() ){

 46         int now = q.front();

 47         q.pop();

 48         for( int i=head[ now ];i!=-1;i=edge[ i ].next ){

 49             int nxt = edge[ i ].u;

 50             if( vis[ nxt ]==0 ){

 51                 vis[ nxt ] = 1;

 52                 q.push( nxt );

 53             }

 54         }

 55     }

 56     for( int i=0;i<sum;i++ ){

 57         if( vis[ v[i] ]==0 ) return false;

 58     }

 59     return true;

 60 }

 61         

 62 int main(){

 63     int a,b;

 64     while( scanf("%d%d",&a,&b)==2 ){

 65         if( a==-1&&b==-1 ) break;

 66         init();

 67         int sum = 0;

 68         int nedge = 0;

 69         nedge++;

 70         if( vis[a]==0 ){

 71             vis[a]++;

 72             v[ sum ] = a;

 73             sum++;

 74         }

 75         if( vis[b]==0 ){

 76             vis[b]++;

 77             v[ sum ] = b;

 78             sum++;

 79         }

 80         addedge( a,b );

 81         addedge( b,a );

 82         if( a==0&&b==0 ){

 83             printf("Yes\n");

 84             continue;

 85         }

 86         while( scanf("%d%d",&a,&b)==2 ){

 87             if( a==0&&b==0 ) break;

 88             nedge++;

 89             if( vis[a]==0 ){

 90                 vis[a]++;

 91                 v[ sum ] = a;

 92                 sum++;

 93             }

 94             if( vis[b]==0 ){

 95                 vis[b]++;

 96                 v[ sum ] = b;

 97                 sum++;

 98             }

 99             addedge( a,b );

100             addedge( b,a );

101         }

102         if( sum-1==nedge&&bfs( v[0],sum )==true ){

103             printf("Yes\n");

104         }

105         else{

106             printf("No\n");

107         }

108     }

109     return 0;

110 }

 

你可能感兴趣的:(HDU)