Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73196
  • 博文数量: 41
  • 博客积分: 1475
  • 博客等级: 上尉
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 22:49
文章分类
文章存档

2012年(8)

2011年(1)

2009年(32)

我的朋友
最近访客

分类: C/C++

2012-03-24 09:02:05

题目: 

思路: (简单的拓扑排序)

代码:

点击(此处)折叠或打开

  1. //
  2. // UVA 10305
  3. // topsort
  4. //
  5. // Author: xfye
  6. // Status: AC
  7. //

  8. #include <iostream>
  9. #include <vector>
  10. #include <list>

  11. using namespace std;

  12. struct Task
  13. {
  14.     Task()
  15.     {
  16.         id = 0;
  17.         numPreTasks = 0;
  18.     }
  19.     int id;
  20.     int numPreTasks;
  21.     vector<Task*> followingTasks;
  22. };

  23. int main()
  24. {
  25.     int n, m;

  26.     cin >> n >> m;
  27.     while (!= 0) {
  28.         Task tasks[101];
  29.         for (int i = 1; i <= n; i++) {
  30.             tasks[i].id = i;
  31.         }
  32.         for (int i = 0; i < m; i++) {
  33.             int t1, t2;
  34.             cin >> t1 >> t2;
  35.             tasks[t2].numPreTasks++;
  36.             tasks[t1].followingTasks.push_back(&tasks[t2]);
  37.         }

  38.         list<Task*> leftTasks;
  39.         for (int i = 1; i <= n; i++) {
  40.             if (tasks[i].numPreTasks == 0) {
  41.                 leftTasks.push_back(&tasks[i]);
  42.             }
  43.         }

  44.         //
  45.         // topsort
  46.         //
  47.         int first = true;
  48.         while (leftTasks.size() > 0) {
  49.             Task *tsk = leftTasks.front();
  50.             if (tsk->numPreTasks == 0) {
  51.                 if (!first) {
  52.                     cout << " ";
  53.                 } else {
  54.                     first = false;
  55.                 }
  56.                 cout << tsk->id;
  57.                 for (int i = 0; i < tsk->followingTasks.size(); i++) {
  58.                     tsk->followingTasks[i]->numPreTasks--;
  59.                     if (tsk->followingTasks[i]->numPreTasks == 0) {
  60.                         leftTasks.push_back(tsk->followingTasks[i]);
  61.                     }
  62.                 }
  63.                 leftTasks.remove(tsk);
  64.             }
  65.         }
  66.         cout << endl;

  67.         cin >> n >> m;
  68.     }
  69. }
阅读(1017) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~