Hdu 5285 wyh2000 and pupil
链接
题意
有n个小学生,编号为1−n,要将所有小学生分成2组,每组都至少有1个人,
且每组中的小学生都互相认识。而且第一组的人要尽可能多,先给定m组关系
每组关系有两种个数 x,y(x<y),表示x不认识y,y不认识x
求1,2组的认识分别为多少?如果找不到分组方案,则输出”Poor wyh”
分析
将不认识的学生连边,设任意一顶点为a,则与a关联的顶点不在同一组,
即若a在1组,那关联的点在2组,若a在2组,则关联的点在a组
由于存在多个不关联的集合,所以对于每个集合选取人数多的一组分为第1组
依次类推。。。
对于没有出现的顶点,表示他们之间互相认识,加到第一组即可
注:由于顶点数很多,邻接矩阵存不了,需要用到邻接表,
可以用vector数组存储,或者链式前向星解决
参考代码 (链式前向星)
1 | #include<stdio.h> |
参考代码 (vector)
1 | #include<stdio.h> |
链式前向星简介
1 | struct stu |
其中edge[i].to表示第i条边的终点,
edge[i].next表示与第i条边同起点的下一条边的存储位置,
edge[i].w为边权值.
head[i],它是用来表示以i为起点的第一条边存储的位置
head 数组一般初始化为-1
对于加边函数,len为当前要加的边的编号,可以初始化为0或11
2
3
4
5
6
7void addEdge(int u,int v,int w)
{
edge[len].to=v;
edge[len].w=w;
edge[len].next=head[u];
head[u]=len++;
}
在遍历以顶点u为起点的所有边:1
2
3
4for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to; //v为u的终点
int w=edge[i].w; //w为边权值
}