题目链接 :http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=3304
选课大作战
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
眼看着大一新生就要来了,原大一的成了学叔学婶。
C又在为了新学期的选课问题忙了起来。。。。。渐渐地他发现了一个问题:当他想学“计算机网络”这门课时,选课系统告诉他必须学过“离散数学”才能学这门科目。
所以我们就称“离散数学”是“计算机网络”的必学科目。现在已知选课系统收集了很多科目的顺序关系,但是,这个选课系统出了一些故障,一些信息可能不准确,所以请你来帮小X是科目Y也是科目"科目Y的必学科目,科目Z的必学科目,科目X的必学科目<font face="\"Times" new="" roman\"="" style="padding: 0px; margin: 0px;">"这类也是错误的。
输入
行:1,表示数据的组数T(1 <= T <= 5)
T组数据按照以下格式:第2个整数,N表示课程总数量,课程编号为M表示顺序关系的数量。
2..M+1行:每行A,B。表示课程B的前置课程。
输出
行:每行1,若该组信息有误,输出"Wrong"<font face="\"宋体\"" 12pt;\"="" style="padding: 0px; margin: 0px;">。
示例输入
22 21 22 13 21 21 3
示例输出
WrongCorrect
提示
来源
示例程序
比较明显的并查集了,但是这题竟然正答率只有30%,是14级集训队学长学姐8月的题目。。直接上代码了:
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- int pre[100000+5];
- int root(int x)
- {
- int r=x;
- while(x!=pre[x])
- {
- x=pre[x];
- }
- while(r!=pre[r]) //路径压缩
- {
- int j=pre[r];
- pre[r]=x;
- r=j;
- }
- return x;
- }
- int main()
- {
- int n, m, t;
- while(~scanf("%d", &t))
- {
- while(t--)
- {
- scanf("%d %d", &n, &m);
- for(int i=0;i<=n;i++)
- pre[i]=i;
- int a, b;
- bool g=1;
- while(m--)
- {
- scanf("%d %d", &a, &b);
- bool f=1;
- while(a!=root(a)) //查找学习科目a的话必须学习的科目
- {
- if(pre[a]==b)
- {
- f=0;
- break;
- }
- a=pre[a];
- }
- if(f) pre[b]=a; //合并
- else {g=0;break;}
- }
- if(!g) printf("Wrong\n");
- else printf("Correct\n");
- }
- }
- return 0;
- }