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 |
我的解法是暴力搜索出那3个bad guy,再SAT-2#include <time.h> #include <stdio.h> #include <stdlib.h> #include <cstring> #include <queue> using namespace std; #define MAX_N 500 int N, M; bool relations[MAX_N][MAX_N]; int relcounts[MAX_N]; unsigned long long masks[MAX_N][8]; int B[3]; int results[MAX_N]; int cache[MAX_N]; int cachecount; bool find_badguy() { unsigned long long tmp[8]; memset(tmp, 0xff, sizeof(tmp)); for (int i = 0; i < N; ++i) { int x = i / 64; int y = i % 64; tmp[x] &= ~(1ULL << y); } for (int i = 0; i < N; ++i) { unsigned long long tmp1[8]; memcpy(tmp1, tmp, 8 * sizeof(unsigned long long)); for (int j = 0; j < 8; ++j) { tmp1[j] |= masks[i][j]; } int c1 = relcounts[i]; int x = i / 64; int y = i % 64; tmp1[x] |= (1ULL << y); for (int j = i + 1; j < N; ++j) { unsigned long long tmp2[8]; memcpy(tmp2, tmp1, 8 * sizeof(unsigned long long)); for (int k = 0; k < 8; ++k) { tmp2[k] |= masks[j][k]; } int c2 = c1 + relcounts[j]; int x = j / 64; int y = j % 64; tmp2[x] |= (1ULL << y); for (int k = j + 1; k < N; ++k) { if (c1 + c2 + relcounts[k] < N - 3) continue; unsigned long long tmp3[8]; memcpy(tmp3, tmp2, 8 * sizeof(unsigned long long)); for (int l = 0; l < 8; ++l) { tmp3[l] |= masks[k][l]; } int x = k / 64; int y = k % 64; tmp3[x] |= (1ULL << y); bool ok = true; for (int l = 0; l < 8; ++l) { if (tmp3[l] != 0xffffffffffffffffULL) { ok = false; break; } } if (ok) { B[0] = i; B[1] = j; B[2] = k; return true; } } } } return false; } bool init() { memset(masks, 0, sizeof(masks)); memset(relcounts, 0, sizeof(relcounts)); for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (relations[i][j]) { int x = j / 64; int y = j % 64; masks[i][x] |= (1ULL << y); relcounts[i]++; } } } bool ret = find_badguy(); if (!ret) return false; return true; } bool calc(int idx, int sel) { if (results[idx]) { return results[idx] == sel; } results[idx] = sel; cache[cachecount++] = idx; for (int i = 0; i < N; ++i) { if (!relations[idx][i]) continue; if (i == B[0] || i == B[1] || i == B[2]) continue; bool flags[4]; memset(flags, 0, sizeof(flags)); for (int j = 0; j < 3; ++j) { if (relations[i][B[j]]) { flags[results[B[j]]] = true; } } flags[sel] = true; int count = 0, sel2 = -1; for (int j = 1; j <= 3; ++j) { if (!flags[j]) { ++count; sel2 = j; } } if (count == 0) return false; if (count > 1) continue; if (!calc(i, sel2)) return false; } return true; } bool calc(int b0, int b1, int b2) { if (b0 == b1 && relations[B[0]][B[1]]) return false; if (b0 == b2 && relations[B[0]][B[2]]) return false; if (b1 == b2 && relations[B[1]][B[2]]) return false; memset(results, 0, sizeof(results)); results[B[0]] = b0; results[B[1]] = b1; results[B[2]] = b2; for (int i = 0; i < N; ++i) { if (results[i]) continue; bool flags[4]; memset(flags, 0, sizeof(flags)); for (int j = 0; j < 3; ++j) { if (relations[i][B[j]]) { flags[results[B[j]]] = true; } } bool ok = false; for (int j = 1; j <= 3; ++j) { if (!flags[j]) { cachecount = 0; if (calc(i, j)) { ok = true; break; } for (int k = 0; k < cachecount; ++k) { results[cache[k]] = 0; } } } if (!ok) return false; } return true; } bool calc() { if (calc(1, 1, 1)) return true; if (calc(2, 1, 1)) return true; if (calc(1, 2, 1)) return true; if (calc(1, 1, 2)) return true; if (calc(1, 2, 3)) return true; return false; } int main() { while (true) { scanf_s("%d %d", &N, &M); if (!N && !M) break; while (N < 1 || N > MAX_N) printf("..."); memset(relations, 0, sizeof(relations)); for (int i = 0; i < M; ++i) { int x, y; scanf_s("%d %d", &x, &y); while (x == y || x < 0 || x >= N || y < 0 || y >= N) printf("..."); relations[x][y] = relations[y][x] = true; } if (N <= 3) { for (int i = 0; i < N; ++i) { printf("%d ", i); } printf("\n"); } else { init(); if (!calc()) { printf("The agents cannot be split\n"); } else { for (int i = 0; i < N; ++i) { printf("%d ", results[i] - 1); } printf("\n"); } } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator