zoukankan      html  css  js  c++  java
  • 【图论】sdut3037--让领导先走(拓扑排序)

    让领导先走 

    Time Limit: 2000MS Memory limit: 65536K

    题目描述

    完啦完啦,公司里发火灾拉,大家快跑啊,再不跑就没命啦。大家不要乱,请按顺序通过消防通道,说到顺序,那么问题来了。

    按照中国特色社会主义文化,我们严格贯彻落实一件事,那就是,让领导先走。

    现在又n人,从1标号到n。如果ab的领导的话,就必须让a排在b的前面。

    那么你就要安排大家的顺序。我保证一定有解。

    输入

     多组输入,然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)m(1 <= m <= 100000),分别表示人数和上下级存在数。


    然后m行,每行两个整数ab,表示有一个ab的领导ab必然不同。

    输出

     对每个测试数据,输出一行排队的顺序,用空格隔开。

     

    示例输入

    5 10
    3 5
    1 4
    2 5
    1 2
    3 4
    1 4
    2 3
    1 5
    3 5
    1 2

    示例输出

    1 2 3 4 5

    拓扑排序,数据比较大,应该用邻接表,不过这个题的后台数据水,用数组也过了。
     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<queue>
     5 #include<string.h>
     6 #define MAXN 5001
     7 short int mapp[MAXN][MAXN];
     8 int in[MAXN], vis[MAXN];
     9 int n, m;
    10 
    11 void topo()
    12 {
    13     int i, j, k, cnt =0, flag=0,ss=0;
    14     for(i=1; i<=n; i++)
    15     {
    16         for(j=1; j<=n; j++)
    17         {
    18            if(in[j]==0 && !vis[j])
    19            {
    20                    cnt++;
    21                    if(ss==n)
    22                 {
    23                     flag =1;
    24                     break;
    25                 }
    26                    if(cnt==n)
    27                 {
    28                     printf("%d
    ", j);
    29                     ss++;
    30                     break;
    31                 }
    32                 else
    33                 {
    34                     printf("%d ", j);
    35                     ss++;
    36                 }
    37            }
    38         }
    39         if(flag) break;
    40         if(in[i]==0)
    41         {
    42             for(k=1; k<=n; k++)
    43             {
    44                 if(mapp[i][k])
    45                 {
    46                     in[k]--;
    47                 }
    48             }
    49             vis[i]=1;
    50         }
    51     }
    52 }
    53 
    54 using namespace std;
    55 
    56 int main()
    57 {
    58     int x, y, i;
    59     while(~scanf("%d%d", &n, &m))
    60     {
    61         memset(mapp, 0, sizeof(mapp));
    62         memset(in, 0, sizeof(in));
    63         memset(vis, 0, sizeof(vis));
    64         for(i=0; i<m; i++)
    65         {
    66             scanf("%d%d", &x, &y);
    67             if(mapp[x][y]==1);
    68             else{
    69                 in[y]++;
    70                 mapp[x][y] = 1;
    71             }
    72         }
    73         topo();
    74     }
    75     return 0;
    76 }



  • 相关阅读:
    利用scanf函数修改内存中任意位置内容
    TSql
    完整性约束及其违约处理
    实现关机、重启、注销
    建立索引的原则
    我只想安静的大便
    格式化GridView特定的值
    SELECT语句执行顺序解析
    CPU对存储器的读写
    Linux常用97条命令
  • 原文地址:https://www.cnblogs.com/6bing/p/4133575.html
Copyright © 2011-2022 走看看