uva1624knots
生活随笔
收集整理的這篇文章主要介紹了
uva1624knots
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:給出一個(gè)橡皮筋,有兩種操作,問(wèn)是否可以將它還原
分析:將橡皮筋一步步還原,先刪除沒(méi)有覆蓋的結(jié)點(diǎn),然后刪除滿(mǎn)足條件的結(jié)點(diǎn)
#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)) {//如果相鄰兩節(jié)點(diǎn)在同一平面,并且兩節(jié)點(diǎn)的遮蓋結(jié)點(diǎn)也是相鄰,那么可以還原,想象一下每次都還原橡皮筋的末端,//注意這是一個(gè)循環(huán),,末端刪除之后會(huì)有下一個(gè)末端,因?yàn)槊看味妓阉髡麠l線(xiàn)的。del(u); del(q[u].face); del(v); del(q[v].face);count -= 4;ok = 0;}else {if (q[u].face == v) {//相鄰結(jié)點(diǎn)覆蓋,直接刪除del(u); del(v);count -= 2;ok = 0;}}}if (ok)break;}cout << "Case #" << ++t << ": " << (count ? "NO\n" : "YES\n");}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的uva1624knots的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。