有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。 

Input输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。 
Output给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。

其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。 
Sample Input

4 3
1 2
2 3
4 3

Sample Output

1 2 4 3

思路:直接拓扑排序即可,输出要求字典序最小,那么DFS就不行,无法保证字典序,直接上优先队列,代码如下:
插一手DFS代码(无字典序)
const int maxm = ;

int G[maxm][maxm], vis[maxm], N, M;
vector<int> ans; bool dfs(int x) {
vis[x] = -;
for (int i = ; i <= N; ++i) {
if(G[x][i]) {
if(vis[i] == -)
return false;
if(!vis[i] && !dfs(i))
return false;
}
}
vis[x] = ;
ans.push_back(x);
return true;
} int main() {
while(scanf("%d%d",&N,&M) != EOF) {
memset(G, , sizeof(G)), ans.clear(), memset(vis, , sizeof(vis));
for (int i = ; i < M; ++i) {
int t1,t2;
scanf("%d%d", &t1, &t2);
G[t1][t2] = ;
}
for(int i = ; i <= N; ++i)
if(!vis[i])
if(!dfs(i))
break;
int cnt = ;
for (auto i = ans.rbegin(); i != ans.rend(); ++i) {
if(cnt++)
printf(" ");
printf("%d", *i);
if(cnt == N)
break;
}
}
return ;
}

AC代码:

const int maxm = ;

int N, M, in[maxm], G[maxm][maxm], ans[maxm], cnt;

struct Node {
int id;
Node(int _id) : id(_id){} bool operator<(const Node &a) const {
return a.id < id;
}
}; int main() {
while(scanf("%d%d", &N, &M) != EOF) {
memset(in, , sizeof(in)), memset(G, , sizeof(G)), cnt = ;
for (int i = ; i < M; ++i) {
int t1, t2;
scanf("%d%d", &t1, &t2);
if(!G[t1][t2]) {
G[t1][t2] = ;
in[t2]++;
}
}
priority_queue<Node> q;
for (int i = ; i <= N; ++i) {
if(!in[i])
q.push(Node(i));
}
while(!q.empty()) {
Node p = q.top();
q.pop();
int u = p.id;
ans[cnt++] = u;
for (int i = ; i <= N; ++i) {
if(G[u][i]) {
if(!--in[i])
q.push(Node(i));
}
}
}
for(int i = ; i < N; ++i) {
if(i)printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
return ;
}

注意读入判重,否则会影响入度的计算。

												

Day4 - G - 确定比赛名次 HDU - 1285的更多相关文章

  1. (拓扑)确定比赛名次 -- hdu -- 1285

    http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  2. 确定比赛名次 HDU - 1285 (拓扑排序)

     注意点: 输入数据中可能有重复,需要进行处理! #include <stdio.h> #include <iostream> #include <cstring> ...

  3. ACM: HDU 1285 确定比赛名次 - 拓扑排序

     HDU 1285 确定比赛名次 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

  4. HDU.1285 确定比赛名次 (拓扑排序 TopSort)

    HDU.1285 确定比赛名次 (拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 只不过这道的额外要求是,输出字典序最小的那组解.那么解决方案就是 ...

  5. hdu oj 1285 确定比赛名次

    hdu oj 1285 确定比赛名次 题目: 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  6. HDU 1285 确定比赛名次

    传送门 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. 正向与反向拓扑排序的区别(hdu 1285 确定比赛名次和hdu 4857 逃生)

    确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  8. hdu 1285 确定比赛名次 (拓扑)

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  9. HDU 1285 确定比赛名次【字典序最小的拓扑排序 + 优先队列】

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

随机推荐

  1. Java基础知识笔记第二章:基本数据类型与数组

    标识符和关键字 标识符: 1:字母,数字,下划线,美元符号 2.不能以数字开头 3.标识符不能是:true   false   null(尽管true   false   null不是java的关键字 ...

  2. java记录3--异常

    异常的分类 1.Error 由java虚拟机生成并抛出,包括动态链接失败,虚拟机错误等等,JAVA程序无法对此错误 try { //可能出现异常的代码块 } catch(exception1 ) { ...

  3. Linux软Raid--mdadm命令

    mdadm:为软RAID提供管理界面,RAID设备可命名为/dev/md0./dev/md1./dev/md2./dev/md3等 命令的语法格式:mdadm[mode] <raiddevice ...

  4. 学习不一样的Vue1:环境搭建

    学习不一样的Vue1:环境搭建  发表于 2017-05-31 |  分类于 web前端|  |  阅读次数 11677 首先 首发博客: 我的博客 项目源码: 源码 项目预览: 预览 因为个人的喜好 ...

  5. 解题报告:luogu P5543 [USACO19FEB]The Great Revegetation S

    题目链接:P5543 [USACO19FEB]The Great Revegetation S 好坑啊,都身败名裂了. 思路一: 考虑染色法,跑一遍搜所就好了,不给代码了. 思路二: 考虑并查集,我想 ...

  6. ardrino#串口控制led

    void setup() { pinMode(D6, OUTPUT); digitalWrite(D6,HIGH); Serial.begin(); } void loop() { String st ...

  7. web前端面试第一次[addEventListenr();绑定事件]

    //当一个元素同时处理多个函数,这里使用按钮 //addEventListener(string类型,处理函数,boolean); <input type="button" ...

  8. 「CQOI2011」动态逆序对

    「CQOI2011」动态逆序对 传送门 树套树. 删除一个位置的元素带来的减损数等于他前面大于它的和后面小于它的,然后这个直接树状数组套主席树维护一下就好了. 参考代码: #include <c ...

  9. MySql的数据导入到Sql Server数据库中

    步骤一:安装MySql驱动 驱动下载链接:https://dev.mysql.com/downloads/connector/odbc/ 下载完成后安装, 一路Next即可 步骤二:创建DSN DSN ...

  10. python-python基础7

    一.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类 ...