UVA 1624 打结

来源:互联网 发布:弱视软件手机版 编辑:程序博客网 时间:2024/04/28 23:15
#include <bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f3f;const double eps = 1E-6;const int maxn = 1E6 + 10;struct Node{int l, r, face;};Node nodes[maxn];int F[maxn], used[maxn];int T, L, P, x, y;void removeNode(int idx){used[idx] = 1;nodes[nodes[idx].r].l = nodes[idx].l;nodes[nodes[idx].l].r = nodes[idx].r;}int main(int argc, char const *argv[]){cin >> T;for (int kase = 1; kase <= T; kase++){cin >> L >> P;for (int i = 0; i < L; i++)nodes[i].l = i - 1, nodes[i].r = i + 1, F[i] = 0, used[i] = 0;nodes[0].l = L - 1, nodes[L - 1].r = 0;for (int i = 0; i < P; i++){cin >> x >> y;nodes[x].face = y;nodes[y].face = x;F[x] = 1, F[y] = -1;}int st = 0, listsize = 2 * P;for (int i = 0; i < L; i++)if (!F[i]) removeNode(i);while (listsize){int update = 0;while (used[st]) st++;for (int i = nodes[st].r; !update && i != st; i = nodes[i].r){x = i, y = nodes[i].r;if (F[x] == F[y] && (nodes[nodes[y].face].r == nodes[x].face || nodes[nodes[x].face].r == nodes[y].face)){//passingremoveNode(x), removeNode(nodes[x].face), removeNode(y), removeNode(nodes[y].face);listsize -= 4; update = 1;}else if (y == nodes[x].face){//self loopremoveNode(x), removeNode(y);listsize -= 2; update = 1;}}if (!update) break;}cout << "Case #" << kase << ": " << (listsize ? "NO" : "YES") << endl;}return 0;}


用结构体模拟了一个圈,l表左边,r表右边,face表重叠,for循环删除没有重叠的边,根据重叠关系模拟即可

0 0
原创粉丝点击