uva1624knots
生活随笔
收集整理的這篇文章主要介紹了
uva1624knots
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給出一個橡皮筋,有兩種操作,問是否可以將它還原
分析:將橡皮筋一步步還原,先刪除沒有覆蓋的結點,然后刪除滿足條件的結點
#include<iostream> #include<string.h> #include<sstream> #include<set> #include<algorithm> #include<vector> #include<map> #include<queue> #include<math.h> using namespace std; const int maxn = 1000000 + 10; struct node {int left, right, face; }q[maxn]; int vis[maxn], layer[maxn]; void del(int id) {vis[id] = 1;q[q[id].left].right = q[id].right;q[q[id].right].left = q[id].left; } int main() {int kase,t=0;cin >> kase;int n, m;while (kase--) {cin >> n >> m;memset(vis, 0, sizeof(vis));memset(layer, 0, sizeof(layer));for (int i = 0; i < n; i++) {q[i].left = i - 1;q[i].right = i + 1;}q[0].left = n - 1;q[n - 1].right = 0;for (int i = 0; i < m; i++) {int u, v;cin >> u >> v;q[u].face = v;q[v].face = u;layer[u] = 1;layer[v] = -1;}for (int i = 0; i < n; i++)if (layer[i] == 0)del(i);int k = 0,count=2*m,u,v;while (count) {int ok = 1;while (vis[k])k++;for (int i = q[k].right; ok&&i != k; i = q[i].right) {u = k; v = q[k].right;if (layer[u] == layer[v] && (q[q[u].face].right == q[v].face || q[q[v].face].right == q[u].face)) {//如果相鄰兩節點在同一平面,并且兩節點的遮蓋結點也是相鄰,那么可以還原,想象一下每次都還原橡皮筋的末端,//注意這是一個循環,,末端刪除之后會有下一個末端,因為每次都搜索整條線的。del(u); del(q[u].face); del(v); del(q[v].face);count -= 4;ok = 0;}else {if (q[u].face == v) {//相鄰結點覆蓋,直接刪除del(u); del(v);count -= 2;ok = 0;}}}if (ok)break;}cout << "Case #" << ++t << ": " << (count ? "NO\n" : "YES\n");}return 0; }?
總結
以上是生活随笔為你收集整理的uva1624knots的全部內容,希望文章能夠幫你解決所遇到的問題。