HDU1689 BFS+最小奇数环

题意:给定一张无向图,求最小的奇数环。

注意:状态的设定 vis[ i ][ 0 ] and vis[ i ][ 1 ] 很重要!!!

View Code
 1 /*
 2 BFS+最小奇数环
 3 */
 4 #include<stdio.h>
 5 #include<string.h>
 6 #include<stdlib.h>
 7 #include<algorithm>
 8 #include<iostream>
 9 #include<queue>
10 #include<stack>
11 #include<math.h>
12 #include<map>
13 using namespace std;
14 const int maxn = 1005;
15 const int maxm = 40005;
16 const int inf = 0x7fffffff;
17 int head[ maxn ],cnt;
18 struct node{
19     int u,next;
20 }edge[ maxm ];
21 int dis[ maxn ],vis[ maxn ][ 2 ];//vis[ i ][ 0 ],在i点偶数步;dis[ i ]仅代表i的 lev !!
22 int mat[ maxn ][ maxn ];
23 int ans;
24 void init(){
25     memset( head,-1,sizeof( head ));
26     cnt=0;
27     memset( mat,-1,sizeof( mat ) );
28     ans=inf;
29 }
30 void addedge( int a,int b ){
31     edge[ cnt ].u=b;
32     edge[ cnt ].next=head[ a ];
33     head[ a ]=cnt++;
34 }
35 void  bfs( int s,int n ){
36     memset( vis,0,sizeof( vis ) );
37     for( int i=1;i<=n;i++ )
38         dis[ i ]=inf;
39     queue<int>q;
40     q.push( s );
41     vis[ s ][ 0 ]=1;
42     dis[ s ]=0;
43     //printf("bfs\n");
44     while( !q.empty() ){
45         int now=q.front();
46         //printf("now:%d\n",now);
47         q.pop();
48         if( vis[ s ][ (dis[s]%2) ]==1 && (dis[ s ]%2)==1 && dis[ s ]>=3 ){
49             ans=min( ans,dis[ s ] );
50         }
51         for( int i=head[ now ];i!=-1;i=edge[ i ].next ){
52             int nxt=edge[ i ].u;
53             //if( dis[ nxt ]>dis[ now ]+1 ){
54             //    dis[ nxt ]=dis[ now ]+1;
55                 if( vis[ nxt ][ ((dis[ now ]+1)%2) ]==0 ){
56                     vis[ nxt ][ ((dis[ now ]+1)%2) ]=1;
57                     dis[ nxt ]=dis[ now ]+1;
58                     q.push( nxt );
59                 }
60         //    }
61         }
62     }
63 }
64     
65 int main(){
66     int ca;
67     scanf("%d",&ca);
68     for( int tca=1;tca<=ca;tca++ ){
69         int n,m;
70         init();
71         scanf("%d%d",&n,&m);
72         int a,b;
73         while( m-- ){
74             scanf("%d%d",&a,&b);
75             addedge( a,b );
76             addedge( b,a );
77             mat[a][b]=mat[b][a]=1;
78         }
79         printf("Case %d: ",tca);
80         if( n<=2 ){
81             printf("Poor JYY.\n");
82             continue;
83         }
84         for( int s=1;s<=n;s++ ){
85             bfs( s,n );
86             //printf("ans:%d\n",ans);
87             if( ans==3 )
88                 break;
89         }
90         if( ans==inf )
91             printf("Poor JYY.\n");
92         else
93             printf("JYY has to use %d balls.\n",ans);
94     }
95     return 0;
96 }

 

posted @ 2013-03-10 11:29  xxx0624  阅读(516)  评论(0编辑  收藏  举报