Rank of Tetris(topsort)
2024-08-31 00:43:57
http://acm.hdu.edu.cn/showproblem.php?pid=1811
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
const int N=;
vector<int>V[N];
queue<int>q;
char oper[N];
int in[N],f[N];
int a[N],b[N];
int n,m,sum;
void init()
{
sum = n;
while(!q.empty()) q.pop();
for (int i = ; i <= n; i++)
{
f[i] = i;
in[i] = ;
V[i].clear();
}
}
int Find(int x)
{
if(x!=f[x]) return f[x]=Find(f[x]);
return x;
}
int Merge(int x,int y)
{
x = Find(x);
y = Find(y);
if(x!=y)
{
f[y] = x;
return ;
}
return ;
}
void toposort()
{
int flag = ;
for (int i = ; i < n; i++)
{
if(in[i]==&&Find(i)==i)
q.push(i);
}
while(!q.empty())
{
if (q.size()>)flag = ;
int u = q.front();
q.pop();
sum--;
for (int i = ; i < V[u].size(); i++)
{
if(--in[V[u][i]]==)
q.push(V[u][i]);
}
}
if (sum > ) printf("CONFLICT\n");
else if (flag) printf("UNCERTAIN\n");
else printf("OK\n");
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
int u,v;
for (int i = ; i < m; i++)
{
scanf("%d %c %d",&a[i],&oper[i],&b[i]);
if(oper[i]=='=')
{
if(Merge(a[i],b[i]))
sum--;
}
}
for (int i = ; i < m; i++)
{
if(oper[i]=='=') continue;
u = Find(a[i]);
v = Find(b[i]);
if(oper[i]=='>')
{
V[u].push_back(v);
in[v]++;
}
if(oper[i]=='<')
{
V[v].push_back(u);
in[u]++;
}
}
toposort();
}
return ;
}
最新文章
- 使用VirtualBox自带管理工具命令为虚拟磁盘扩展空间
- Sqli-LABS通关笔录-13
- android6.0 适配的问题——activity销毁的问题
- assertThat用法
- linux下gcc编译多个源文件、gdb的使用方法
- eWebeditor编辑器上传图片路径错误解决方法[疑难杂症]【转,作者:unvs】
- screenX clientX pageX的区别
- 网站注册(css)
- 关于EL表达式的大小写问题。谁来帮我解答?
- 纯windows下制作变色龙引导安装U盘教程
- 查看Android数据库文件
- css绘制倒三角
- hibernate之Session对象
- Tomcat Getshell
- Day 6-1计算机网络基础&;TCP/IP
- VMWare安装CentOS 6.5图解
- 【剑指offer】数组中出现次数超过一半的数字
- UVa 548 Tree(二叉树最短路径)
- Scrapy的安装和基本使用方法
- MariaDB数据表操作实例