巡回赛 -- 简单的拓扑排序
2016-04-07 19:38
246 查看
这是我最爱的 红色 . NICE
题意 : 第一行 测试案例的组数 第二行每一组案例的 拳手个数 和 比赛的场数 如果不能确定唯一的排名 就输出 No Answer 下面附上渣渣代码
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<set> #include<stack> #include<string> #include<sstream> #include<map> #include<cctype> using namespace std; int a[30][30],n,m,visited[30],result[30]; void topsort() // 有唯一的 序列 { int mark=0,flag,fuck=1; for(int i=1;i<=n;i++) // 从第一名开始找 { mark=0; for(int j=0;j<n;j++) // 从这些人中 开始找 { if(visited[j]==0) // 没有爸爸 { flag=j; // 这个 没有 爸爸 mark++; } } if(mark!=1) // 1 : mark=0 就是 都有爸爸 , 成环了 2 : 有两个没爸爸的 , 搞基了 { fuck=0; printf("No Answer"); break; } result[i]=flag; // 第一名存起来 visited[flag]--; // 第一名欠一个爸爸 ( 这个人已经被用了 ) for(int k=0;k<n;k++) { if(a[k][flag]) // 以刚才没有爸爸的人 做爸爸的 ( 也就是 没有爷爷 ) , 现在爸爸死了 , 儿子们的亲爸爸 -1 { visited[k]--; } } } if(fuck) for(int i=1;i<=n;i++) printf("%c",result[i]+'A'); printf("\n"); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(visited,0,sizeof(visited)); memset(a,0,sizeof(a)); for(int i=0;i<m;i++) { char b,c; scanf(" %c %c",&b,&c); if(a[c-'A'][b-'A']==0) // 直接 防止 有重边 //由于 从 高到底输出 { a[c-'A'][b-'A']=1; // c 有一个 叫做 b 的 爸爸 visited[c-'A']++; // c 的爸爸数 ++ } } topsort(); } }
相关文章推荐
- 剑指offter-面试题7.用两个栈实现队列
- 一维搜索算法基本原理、典型算法初步
- 【数据结构与算法】LCA
- Xml解析
- MongoDB搭建副本集(二)
- 国内最新安卓渠道列表42个(转)
- Cocos2d-x多语言支持解决方式
- ssh 免密码登录
- "Linux内核分析"第七周
- Android中的回调
- JUC 常用类
- 判断两个字符串是否为旋转词
- Android滑动菜单框架完全解析,教你如何一分钟实现滑动菜单特效
- java操作redis基本功能_Main方法(六)
- 自我提升
- package.json for NPM 文件详解
- C语言问卷调查
- [DP LIS] BZOJ 4282 慎二的随机数列
- 关于安卓长度单位计算方法
- mybatis insert 空属性用trim suffix="" suffixOverrides=","去多余的“,”