设为首页 加入收藏

TOP

POJ1291-并查集/dfs(一)
2014-11-23 21:54:17 来源: 作者: 【 】 浏览:28
Tags:POJ1291- 查集 /dfs
  1. 并查集  
  2. 题意:找出给定的这些话中是否有冲突。若没有则最多有多少句是对的。  


  1. /* 
  2. 思路:如果第x句说y是对的,则x,y必定是一起的,x+n,y+n是一起的;反之x,y+n//y,x+n是一起的。 
  3.     利用并查集判断 x 和 x+n 是否在同一集合。 
  4.     至于查找最多正确的话,对这些 “小树” 进行dfs即可。 
  5. */  
  6. #include  
  7. #include  
  8. #include  
  9. #include  
  10. #include  
  11. #include  
  12. #include  
  13. #include  
  14. #include  
  15. #include  
  16. using namespace std;  
  17. typedef long long int64;  
  18. //typedef __int64 int64;  
  19. typedef pair PII;  
  20. #define MP(a,b) make_pair((a),(b))   
  21. const int maxn = 2005;  
  22. const int inf = 0x7fffffff;  
  23. const double pi=acos(-1.0);  
  24. const double eps = 1e-8;  
  25.   
  26. int fa[ maxn ];  
  27. int rank[ maxn ];  
  28. struct Edge{  
  29.     int u,v,next;  
  30. }edge[ maxn<<1 ];  
  31. int cnt,head[ maxn ];  
  32. int vis[ maxn ];  
  33. int Cnt_true,Cnt_false;  
  34.   
  35. void init( int n ){  
  36.     cnt = 0;  
  37.     //Cnt_true = Cnt_false = 0;  
  38.     memset( head,-1,sizeof( head ) ) ;  
  39.     forint i=1;i<=n;i++ ){  
  40.         fa[ i ] = i;  
  41.         rank[ i ] = 1;  
  42.         vis[ i ] = 0;  
  43.     }  
  44. }  
  45.   
  46. void addedge( int a,int b ){  
  47.     edge[ cnt ].u = a;  
  48.     edge[ cnt ].v = b;  
  49.     edge[ cnt ].next = head[ a ];  
  50.     head[ a ] = cnt ++ ;  
  51.       
  52.     edge[ cnt ].u = b;  
  53.     edge[ cnt ].v = a;  
  54.     edge[ cnt ].next = head[ b ];  
  55.     head[ b ] = cnt ++ ;  
  56. }  
  57.   
  58. int find( int x ){  
  59.     if( x==fa[x] )  
  60.         return 
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu3328(翻转card) 下一篇for循环的基本用法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis压力测试实战 - (2025-12-27 09:20:24)
·高并发一上来,微服 (2025-12-27 09:20:21)
·Redis 高可用架构深 (2025-12-27 09:20:18)
·Linux 系统监控 的完 (2025-12-27 08:52:29)
·一口气总结,25 个 L (2025-12-27 08:52:27)