有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 ;
}

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

												

最新文章

  1. node命令
  2. thinkpad E450 fn快捷键设置
  3. spring配置中,properties文件以及xml文件配置问题
  4. Redis服务停止报错解决方案[NOAUTH Authentication required]
  5. itoa的源代码实现
  6. iOS 8以上的设置的跳转
  7. [Hapi.js] Up and running
  8. ubuntu16.04安装kde桌面出错: /var/cache/apt/archives/kde-config-telepathy-accounts_4%3a15.12.3-0ubuntu1_amd64.deb
  9. Navicat工具Oracle数据库复制 or 备用、恢复功能(评论都在谈论需要教)
  10. 《HTML5与CSS3权威指南》读书笔记(下册)—CSS3篇
  11. echarts学习总结(二):一个页面存在多个echarts图形,图形自适应窗口大小
  12. 200_longest-palindromic-substring
  13. shiro笔记-AuthenticatingRealm和AuthorizingRealm关系
  14. 压力测试:系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
  15. Fiddler抓取手机端(ios+android)APP接口数据(http+https)
  16. @@identity与SCOPE_IDENTITY的区别
  17. django练习题
  18. CS229 6.10 Neurons Networks implements of softmax regression
  19. springMVC返回给页面参数的三种形式
  20. [leetcode]Add Binary @ Python

热门文章

  1. hadoop3.1.1高可用集群web端口9870
  2. SSH项目Dao层和Service层及Action的重用
  3. JAVA高级编程数据源datasource
  4. 从零构建以太坊(Ethereum)智能合约到项目实战——第24章 IPFS + 区块链
  5. 利用正则表达式判断Java中的秒钟、分钟、小时、日、月是否符合规则
  6. Codeforces Round #585 (Div. 2)E(状态压缩DP,思维)
  7. Linux centos7VMware Apache和PHP结合、Apache默认虚拟主机
  8. 好用的log打印类
  9. SRS源码—— Thread笔记
  10. 如何优雅的写好python代码?