hdu 1811 Rank of Tetris
2013-11-15 10:19
381 查看
这题的关键点就是对 “=” 的处理,这个要用到并查集。把是“=”关系的点放在统一集合内,处理其中每一个点时都当做处理根结点。
数据不全的情况是同时出现两个点的入度为0,(当两个点具有“ = ”关系时,我们默认是一个点)。
#include<iostream>
#include<vector>
#include<queue>
#include<stdio.h>
#include<cstring>
#define maxn 100010
using namespace std;
int a[maxn],b[maxn],from[maxn],pa[maxn],sum,n,m;
queue<int>q;
char c[maxn];
vector<int>map[maxn];
bool uncertain;
int find(int a){
if(pa[a] == a)return a;
return pa[a] = find(pa[a]);
}
int link(int a,int b){
a = find(a);
b = find(b); //没写这个就re了
if(a==b)return 0;
pa[b]=a;
return 1;
}
void topo(){
for(int i=0;i<n;i++)
if(from[i]==0&&find(i)==i){
q.push(i);
}
while(!q.empty()){
if(q.size()>1) uncertain=true;
int temp=q.front();
q.pop();
sum--;
for(int i=0;i<map[temp].size();i++)
{
if(--from[map[temp][i]]==0){
q.push(map[temp][i]);
}
}
}
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
uncertain=false;
sum=n;
memset(from,0,sizeof(from));
for(int i=0;i<n;i++){
pa[i]=i;
map[i].clear();
}
for(int i=0;i<m;i++){
scanf("%d %c %d",&a[i],&c[i],&b[i]);
if(c[i]=='=') { //对“=”预处理
if(link(a[i],b[i]))
sum--;
}
}
for(int i=0;i<m;i++){
int x=find(a[i]);
int y=find(b[i]);
if(c[i]=='=') continue;
if(c[i]=='>') {
map[x].push_back(y);
from[y]++;
}
if(c[i]=='<'){
map[y].push_back(x);
from[x]++;
}
}
topo();
if(sum>0)printf("CONFLICT\n");
else if(uncertain) printf("UNCERTAIN\n");
else printf("OK\n");
}
}
数据不全的情况是同时出现两个点的入度为0,(当两个点具有“ = ”关系时,我们默认是一个点)。
#include<iostream>
#include<vector>
#include<queue>
#include<stdio.h>
#include<cstring>
#define maxn 100010
using namespace std;
int a[maxn],b[maxn],from[maxn],pa[maxn],sum,n,m;
queue<int>q;
char c[maxn];
vector<int>map[maxn];
bool uncertain;
int find(int a){
if(pa[a] == a)return a;
return pa[a] = find(pa[a]);
}
int link(int a,int b){
a = find(a);
b = find(b); //没写这个就re了
if(a==b)return 0;
pa[b]=a;
return 1;
}
void topo(){
for(int i=0;i<n;i++)
if(from[i]==0&&find(i)==i){
q.push(i);
}
while(!q.empty()){
if(q.size()>1) uncertain=true;
int temp=q.front();
q.pop();
sum--;
for(int i=0;i<map[temp].size();i++)
{
if(--from[map[temp][i]]==0){
q.push(map[temp][i]);
}
}
}
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
uncertain=false;
sum=n;
memset(from,0,sizeof(from));
for(int i=0;i<n;i++){
pa[i]=i;
map[i].clear();
}
for(int i=0;i<m;i++){
scanf("%d %c %d",&a[i],&c[i],&b[i]);
if(c[i]=='=') { //对“=”预处理
if(link(a[i],b[i]))
sum--;
}
}
for(int i=0;i<m;i++){
int x=find(a[i]);
int y=find(b[i]);
if(c[i]=='=') continue;
if(c[i]=='>') {
map[x].push_back(y);
from[y]++;
}
if(c[i]=='<'){
map[y].push_back(x);
from[x]++;
}
}
topo();
if(sum>0)printf("CONFLICT\n");
else if(uncertain) printf("UNCERTAIN\n");
else printf("OK\n");
}
}
相关文章推荐
- HDU 1811 Rank of Tetris
- hdu-1811 Rank of Tetris
- hdu 1811 Rank of Tetris
- 并查集+拓扑 hdu 1811 Rank of Tetris
- HDU 1811 Rank of Tetris
- HDU 1811 Rank of Tetris
- Rank of Tetris (hdu 1811 拓扑排序)
- hdu 1811 Rank of Tetris
- HDU 1811 Rank of Tetris
- HDU-1811-Rank of Tetris
- HDU 1811 Rank of Tetris
- HDU - 1811 Rank of Tetris
- HDU 1811 Rank of Tetris
- hdu 1811 Rank of Tetris
- hdu 1811 Rank of Tetris
- HDU 1811 Rank of Tetris
- HDU 1811 Rank of Tetris
- HDU-1811 Rank of Tetris
- hdu 1811 Rank of Tetris
- hdu 1811 Rank of Tetris