HDU1689 BFS+最小奇数环

本文介绍了一种使用BFS算法寻找给定无向图中最小奇数环的方法。通过记录每个节点的状态(偶数步或奇数步到达)来有效避免非奇数环的情况,并确保找到符合条件的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

注意:状态的设定 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 }

 

转载于:https://www.cnblogs.com/xxx0624/archive/2013/03/10/2952503.html

基于Spring Boot搭建的一个多功能在线学习系统的实现细节。系统分为管理员和用户两个主要模块。管理员负责视频、文件和文章资料的管理以及系统运营维护;用户则可以进行视频播放、资料下载、参与学习论坛并享受个性化学习服务。文中重点探讨了文件下载的安全性和性能优化(如使用Resource对象避免内存溢出),积分排行榜的高效实现(采用Redis Sorted Set结构),敏感词过滤机制(利用DFA算法构建内存过滤树)以及视频播放的浏览器兼容性解决方案(通过FFmpeg调整MOOV原子位置)。此外,还提到了权限管理方面自定义动态加载器的应用,提高了系统的灵活性和易用性。 适合人群:对Spring Boot有一定了解,希望深入理解其实际应用的技术人员,尤其是从事在线教育平台开发的相关从业者。 使用场景及目标:适用于需要快速搭建稳定高效的在线学习平台的企业或团队。目标在于提供一套完整的解决方案,涵盖从资源管理到用户体验优化等多个方面,帮助开发者更好地理解和掌握Spring Boot框架的实际运用技巧。 其他说明:文中不仅提供了具体的代码示例和技术思路,还分享了许多实践经验教训,对于提高项目质量有着重要的指导意义。同时强调了安全性、性能优化等方面的重要性,确保系统能够应对大规模用户的并发访问需
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值