hdu 1811 Rank of Tetris 【并查集+拓扑排序】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811

分析: 很明显是道拓扑排序的题,有一点就是处理实力相等的问题;

可以用并查集把实力相等的组成一个集合。

说一下拓扑排序的性质:

1、如果入度为0的点大于1,则排序不唯一

2、如果排序的总数小于给定的数,则存在环路

献上代码:

#include<stdio.h>

#include<string.h>

#include<algorithm>

#include<iostream>

#include<queue>

using namespace std;

const int maxh=10000+10;

const int maxe=20000+10;

typedef struct Edge

{

int to,next;

};

typedef struct Node

{

int u,v;

char c[2];

};

Edge E[maxe];

Node N[maxe];

int head[maxh],fa[maxh],in[maxh],n,m,sum,cnt;

void init(int num)

{

for(int i=0;i<=num;i++)

{

head[i]=-1;

fa[i]=i;

in[i]=0;

}

cnt=0;

sum=num;

}

void add(int a,int b)

{

E[cnt].to=b;

E[cnt].next=head[a];

head[a]=cnt++;

}

int find(int x)

{

if(x!=fa[x])

fa[x]=find(fa[x]);

return fa[x];

}

void Union(int x,int y)

{

int a=find(x);

int b=find(y);

if(a!=b)

{

fa[a]=b;

}

}

int main()

{

bool flag1,flag2;

int a,b;

while(~scanf("%d%d",&n,&m))

{

init(n);

flag1=false,flag2=false;

for(int i=0;i<m;i++)

{

scanf("%d%s%d",&N[i].u,&N[i].c,&N[i].v);

//  cin>>N[i].u>>N[i].c>>N[i].v;

if(N[i].c[0]==‘=‘)

{

Union(N[i].u,N[i].v);

sum--;

}

}

for(int i=0;i<m;i++)

{

if(N[i].c[0]==‘=‘)continue;

a=find(N[i].u);

b=find(N[i].v);

if(a==b)

{

flag1=true;

}

if(N[i].c[0]==‘>‘)

{

add(a,b);

in[b]++;

}

else

{

add(b,a);

in[a]++;

}

}

queue<int>Q;

for(int i=0;i<n;i++)

{

a=find(i);

if(!in[a]&&i==fa[a])

{

Q.push(a);

}

}

while(!Q.empty())

{

a=Q.front();

Q.pop();

if(!Q.empty())flag2=true;

sum--;

for(int i=head[a];i+1;i=E[i].next)

{

in[E[i].to]--;

if(!in[E[i].to])

Q.push(E[i].to);

}

}

//  printf("sum=%d\n",sum);

//  printf("flag1=%d,flag2=%d,sum=%d\n",flag1,flag2,sum);

if(flag1||sum>0)

{

printf("CONFLICT\n");

}

else if(flag2)

{

printf("UNCERTAIN\n");

}

else

{

printf("OK\n");

}

}

return 0;

}

时间: 2024-10-11 09:59:58

hdu 1811 Rank of Tetris 【并查集+拓扑排序】的相关文章

hdu 1811 Rank of Tetris 并查集+拓扑排序,,提高题

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5672    Accepted Submission(s): 1616 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想

hdu 1811 Rank of Tetris (并查集+拓扑排序)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5415    Accepted Submission(s): 1514 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了

hdu1811 Rank of Tetris 并查集+拓扑排序

1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 struct node//边 7 { 8 int a, b;//顶点 9 char ch;//运算符 10 }c[10005]; 11 vector<int>map[10005];//map数组存贮邻接表 (大佬都是这么开数组的) 12

hdu 1811Rank of Tetris (并查集 + 拓扑排序)

1 /* 2 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B,小于B. 3 4 现在Lele并不是让你来帮他制作这个高手榜,他只是想知道,根据这些信息是否能够确定出这个高手榜,是的话就输出"OK". 5 否则就请你判断出错的原因,到底是因为信息不完全(输出"UNCERTAIN"),还是因为这些信息中包含冲突(输出&quo

HDU1811Rank of Tetris(并查集+拓扑排序)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5683    Accepted Submission(s): 1622 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想

【HDU】5222 Exploration(并查集+拓扑排序)

对于无向边使用并查集合并成一个集合,对于有向边使用判断是否存在环 唯一无语的地方就是看输入是百万级的,加个输入挂跑9s,不加挂跑了5s #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") const

HDU 1811:Rank of Tetris(并查集+拓扑排序)

http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球.为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低来排,如果两个人具有相同的Rating,那就按

hdu 1811 Rank of Tetris (拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4931 Accepted Submission(s): 1359 Problem Description自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他

hdu--1811--并查集&amp;&amp;拓扑排序&lt;好题&gt;

做了这题 绝逼 累啊.. mle -- re<stack overflow>--tle--wa---ac 经过这么5步 终于AC了 这题 我觉得可以让你更好地来 理解 拓扑排序的一些细节问题 首先 这题 为什么要用到并查集呢? 因为 会有 A = B这种情况的出现 然后可能再来个 B =C A = D....那么我们就需要将它们全部表示成一个点 那么就是都用一个根结点来表示 然后 这边 是要判断 能不能根据给出的条件 形成一个排列 那么就是个 拓扑问题 根据 > <情况来判断 我觉