题目链接
题解
待补充
代码
/*
* @Date: 2021-12-07 17:51:55
* @LastEditors: fuchaoxin
* @LastEditTime: 2021-12-08 12:21:53
* @FilePath: \Visual Studio\c++\Knots.cpp
*/
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int pre, next;
} node_list[1000001];
int deleteNode(int index, int ud[])
{
ud[index] = 0;
node_list[node_list[index].pre].next = node_list[index].next;
node_list[node_list[index].next].pre = node_list[index].pre;
return node_list[index].next;
}
int main(void)
{
int T;
scanf("%d", &T);
int index = 1;
while (T-- > 0)
{
// initialize
int L, P;
scanf("%d %d", &L, &P);
int link[L], ud[L], visited[L];
memset(ud, 0, sizeof(ud));
memset(link, 0, sizeof(link));
memset(visited, 0, sizeof(visited));
// construct the link and the ud
for (int i = 0; i < P; i++)
{
int upper, lower;
scanf("%d %d", &upper, &lower);
link[upper] = lower;
link[lower] = upper;
ud[upper] = +1;
ud[lower] = -1;
}
// construct the node_list
for (int i = 0; i < L; i++)
{
node_list[i].pre = i - 1;
node_list[i].next = i + 1;
}
// modify
node_list[0].pre = L - 1; // it should not be -1, it's L - 1
node_list[L - 1].next = 0; // it shoud not be L, it's 0
// delete empty nodes
for (int i = 0; i < L; i++)
{
if (ud[i] == 0)
{
deleteNode(i, ud);
}
}
// find the startNode
int startNode = 0;
while (ud[startNode] == 0)
{
startNode++;
}
// solve knots
int tag = 1;
while (P > 0)
{
bool flag = false;
for (int i = startNode; visited[i] != tag; i = node_list[i].next)
{
if (flag)
{
break;
}
int node1 = i;
int node2 = node_list[node1].next;
// int node3 = link[node1];
// int node4 = link[node2];
visited[node1] = tag;
if (link[node1] == node2 || link[node2] == node1)
{
// self loop
startNode = deleteNode(node1, ud);
startNode = deleteNode(node2, ud);
tag++;
P--;
flag = true;
}
else if (ud[node1] == ud[node2] && (node_list[link[node1]].next == link[node2] || node_list[link[node2]].next == link[node1]))
{
// passing
startNode = deleteNode(node1, ud);
startNode = deleteNode(node2, ud);
startNode = deleteNode(link[node1], ud);
startNode = deleteNode(link[node2], ud);
tag++;
P -= 2;
flag = true;
}
}
if (!flag) // avoid useless loop
{
break;
}
}
// System.out
if (P == 0)
{
printf("Case #%d: YES\n", index);
}
else
{
printf("Case #%d: NO\n", index);
}
index++;
}
return 0;
}