Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
不知道错在什么地方?请明白的同学帮忙看看逻辑有没有问题,谢谢:)// 1182.cpp : 定义控制台应用程序的入口点。 // #include <iostream> #include <string> using namespace std; #define MAX_N 60000 int parent[MAX_N]; int eat[MAX_N]; int self[MAX_N]; int eaten[MAX_N]; int weight[MAX_N]; void MakeSet() { memset(parent , 0 , sizeof(int)*MAX_N); memset(eat , 0 , sizeof(int)*MAX_N); //memset(self , 0 , sizeof(int)*MAX_N); memset(eaten , 0 , sizeof(int)*MAX_N); for(int i = 1 ; i < MAX_N ; i++) { weight[i] = 1; } } int wUnion(int U , int V) { int newRoot; if((U == 0 && V == 0) || U == V) return U; if(weight[U] >= weight[V]) { weight[U] += weight[V]; parent[V] = U ; parent[U] = 0; newRoot = U; } else { weight[V] += weight[U]; parent[U] = V; parent[V] = 0; newRoot = V; } return newRoot; } int cFind(int U ) { if(U == 0) return 0; int oldParent = parent[U]; if(oldParent == 0 || oldParent == U) return U; int node = U; while(parent[node] != 0 && parent[node]!= node) { node = parent[node]; } if(oldParent != node) parent[U] = node; return node; } bool isTheSameClass(int U , int V) { int rootU = cFind(U); int rootV = cFind(V); if(rootU == 0 || rootV == 0) return false; else if(rootU == rootV) return true; else return false; } int main(int argc, char* argv[]) { int N , K , isEat , X , Y; while(cin >> N >> K) { int lies , i; lies = 0; MakeSet(); for(i = 0 ; i < K ; i++) { cin >> isEat >> X >> Y; if(X > N || Y > N) { lies++; continue; } if(isEat == 1) { if(isTheSameClass(eat[X] , Y) || isTheSameClass(eaten[X] , Y) || isTheSameClass(X , eat[Y]) || isTheSameClass(X , eaten[Y])) { lies++; continue; } else { int root1 , root2 , newRoot; root1 = eat[X];root2 = eat[Y]; newRoot = wUnion(root1 , root2); eat[X] = eat[Y] = newRoot; root1 = eaten[X];root2 = eaten[Y]; newRoot = wUnion(root1 , root2); eaten[X] = eaten[Y] = newRoot; root1 = X;root2 = Y; newRoot = wUnion(root1 , root2); //parent[X] = parent[Y] = newRoot; } } if(isEat == 2) { if(X == Y ) { lies++; continue; } if(isTheSameClass(X , Y) || isTheSameClass(X , eat[Y]) || isTheSameClass(eaten[X] , Y)) { lies++; continue; } else { int root1 , root2 , newRoot; root1 = eaten[X];root2 = eat[Y]; newRoot = wUnion(root1 , root2); eaten[X]= eat[Y] = newRoot; root1 = X;root2 = eaten[Y]; newRoot = wUnion(root1 , root2); eaten[Y] = newRoot; //parent[X]= eaten[Y] = newRoot; root1 = eat[X];root2 = Y; newRoot = wUnion(root1 , root2); eat[X] = newRoot; //eat[X] = parent[Y] = newRoot; } } } cout << lies<< endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator