hdu 4751 Divide Groups(简单模拟题)
2013-11-12 14:31
323 查看
这道题其实就是一个简单的模拟题。。。因为数据量很小嘛。。。
首先用一个二维数组存下关系图,然后再用两个数组表示两个集合s1,s2,然后分别按照1~n,和n~1的顺序对元素进行分类,对于元素i来说看它能否分到两个集合,如果不能那么就是NO,停止分配元素。正反两次顺序只要有一次能把所有元素全部分完,就输出YES,具体的就是代码了
首先用一个二维数组存下关系图,然后再用两个数组表示两个集合s1,s2,然后分别按照1~n,和n~1的顺序对元素进行分类,对于元素i来说看它能否分到两个集合,如果不能那么就是NO,停止分配元素。正反两次顺序只要有一次能把所有元素全部分完,就输出YES,具体的就是代码了
#include<iostream> #include<cstring> #include<string> #include<cstdlib> #include<algorithm> using namespace std; int kep[105][105]; //关系图数组 int s1[10500],s2[10500]; //集合s1,s2 int main() { int n; while(~scanf("%d",&n)) { memset(kep,0,sizeof(kep)); memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); for(int i=1;i<=n;i++) { while(1) { int a; scanf("%d",&a); if(a==0) break; kep[i][a]=1; } } int len1=0,len2=0,flag=1; for(int i=1;i<=n;i++) //1~n顺序 { if(i==1) s1[++len1]=1; else { int k=len1; while(k) { if(!kep[s1[k]][i] || !kep[i][s1[k]]) break; k--; } if(k!=0) { k=len2; while(k) { if(!kep[s2[k]][i] || !kep[i][s2[k]]) break; k--; } if(k!=0) { flag=0; break; } else s2[++len2]=i; } else s1[++len1]=i; } } if(!flag) { flag=1; len1=len2=0; for(int i=n;i>=1;i--) //n~1顺序 { if(i==n) s1[++len1]=n; else { int k=len1; while(k) { if(!kep[s1[k]][i] || !kep[i][s1[k]]) break; k--; } if(k!=0) { k=len2; while(k) { if(!kep[s2[k]][i] || !kep[i][s2[k]]) break; k--; } if(k!=0) { flag=0; break; } else s2[++len2]=i; } else s1[++len1]=i; } } } if(flag) printf("YES\n"); else printf("NO\n"); } // system("pause"); return 0; }
相关文章推荐
- Java基础加强二注解、泛型、类加载器、代理类
- 利特尔法则
- 东软实训心得:职业生涯的起点
- 关于RGB、YUY2、YUYV、YVYU、UYVY、AYUV DirectShow中常见的RGB/YUV格式
- linux网络编程之socket:使用fork并发处理多个client的请求
- 10部电影,
- 最小生成树------Kruskal算法
- POJ_1083
- assets文件夹资源的访问
- Tools for HTML5 developer
- is not in the sudoers file
- RMQ算法
- SQL练习_1
- 应用程序间通信
- 处男作《程序员第二步—从程序员到项目经理》分娩记之一
- hdu1575(矩阵乘法快速幂)
- 给大学生学习ARM和FPGA的建议(周立功)
- 给大学生学习ARM和FPGA的建议(周立功)
- 使用 sz rz下载和上传文件
- Linux时间编程