poj1182解题报告
2012-10-16 11:35
323 查看
题意:中文题,自己读吧
题解:并查集,只不过增加了一个当前点到与根节点的关系
题解:并查集,只不过增加了一个当前点到与根节点的关系
#include <iostream> #include <cstring> #include <cstdio> using namespace std ; const int MAXN = 50005 ; int N ; int father[MAXN] ; int rank[MAXN*2] ; int change( int X ) { switch( X ) { case 0 : return 0 ; case 1 : return 1 ; case 2 : return -1 ; case -1 : return -1 ; case -2 : return 1 ; } } int find( int X ) { if( father[X] == X ) return X ; int t = father[X] ; father[X] = find( father[X] ) ; rank[X] = change( rank[X] + rank[t] ) ; return father[X] ; } bool function( int D , int X , int Y ) { if( X > N || Y > N ) return true ; int f1 = find( X ) ; int f2 = find( Y ) ; if( f1 != f2 ) { father[f1] = f2 ; if( D == 1 ) { if( rank[X] == rank[Y] ) { rank[f1] = 0 ; return 0 ; } if( rank[X] == 0 ) { rank[f1] = rank[Y] ; return 0 ; } if( rank[X] == 1 && rank[Y] == 0 ) { rank[f1] = -1 ; return 0 ; } if( rank[X] == 1 && rank[Y] == -1 ) { rank[f1] = 1 ; return 0 ; } if( rank[X] == -1 && rank[Y] == 0 ) { rank[f1] = 1 ; return 0 ; } if( rank[X] == -1 && rank[Y] == 1 ) { rank[f1] = -1 ; return 0 ; } } else { if( rank[X] == 0 && rank[Y] == 0 ) { rank[f1] = 1 ; return 0 ; } if( rank[X] == 0 && rank[Y] == 1 ) { rank[f1] = -1 ; return 0 ; } if( rank[X] == 0 && rank[Y] == -1 ) { rank[f1] = 0 ; return 0 ; } if( rank[X] == 1 && rank[Y] == 0 ) { rank[f1] = 0 ; return 0 ; } if( rank[X] == 1 && rank[Y] == 1 ) { rank[f1] = 1 ; return 0 ; } if( rank[X] == 1 && rank[Y] == -1 ) { rank[f1] = -1 ; return 0 ; } if( rank[X] == -1 && rank[Y] == 0 ) { rank[f1] = -1 ; return 0 ; } if( rank[X] == -1 && rank[Y] == 1 ) { rank[f1] = 0 ; return 0 ; } if( rank[X] == -1 && rank[Y] == -1 ) { rank[f1] = 1 ; return 0 ; } } } else { if( D == 1 ) { if( rank[X] != rank[Y] ) return 1 ; } else { if( rank[X] == rank[Y] ) return 1 ; if( rank[X] == -1 && rank[Y] == 0 ) return 1 ; if( rank[X] == 0 && rank[Y] == 1 ) return 1 ; if( rank[X] == 1 && rank[Y] == -1 ) return 1 ; } return 0 ; } } int main() { int K , ans = 0 ; int D , X , Y ; scanf( "%d%d" , & N , & K ) ; memset( rank , 0 , sizeof( rank ) ) ; for( int i = 0 ; i <= N ; i ++ ) father[i] = i ; while( K -- ) { scanf( "%d%d%d" , & D , & X , & Y ) ; ans += function( D , X , Y ) ; } printf( "%d\n" , ans ) ; return 0 ; }
相关文章推荐
- POJ 1182 食物链 -- 解题报告
- poj 1182 食物链(并查集)解题报告(转)
- 【解题报告】 POJ 1182 食物链 并查集的经典应用+相对位置
- POJ1182 解题报告
- 【原创】poj ----- 1182 食物链 解题报告
- POJ1182 食物链 ACM解题报告(并查集+路径压缩难题)
- poj 1182 食物链(并查集)解题报告(转)
- POJ 1182 解题报告
- poj 1182 食物链 解题报告
- poj解题报告——1182
- 【POJ1182】食物链,思路+数据+代码,可能是史上关于这道题最详细的解题报告
- POJ-1182-食物链 解题报告
- poj 1182-食物链解题报告
- POJ 1182 并查集 解题报告
- POJ-2676 Sudoku 解题报告
- POJ 1742 解题报告
- poj1742 Coins 解题报告
- POJ - 1990 MooFest解题报告(树状数组+离线处理)
- POJ 2739(连续素数和) 解题报告
- POJ2255 解题报告