• 确定比赛名次


    http://acm.hdu.edu.cn/showproblem.php?pid=1285

    View Code
     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std ;
     4 #define maxn 501
     5 int map[maxn][maxn] ;
     6 int indegree[maxn], ans[maxn] ;
     7 int topological(int n)
     8 {
     9     for(int i=1; i<=n; i++)
    10     {
    11         int j = 1 ;
    12         while(indegree[j])
    13         j++ ;
    14         ans[i] = j ;
    15         indegree[j] = -1 ;
    16         for(int k=1; k<=n; k++)
    17         {
    18             if(map[j][k])
    19             indegree[k]-- ;
    20         }
    21     }
    22     return 0 ;
    23 }
    24 int main()
    25 {
    26     int n, m, p1, p2 ;
    27     while(cin>>n>>m)
    28     {
    29         memset(map, 0, sizeof(map)) ;
    30         memset(indegree, 0, sizeof(indegree)) ;
    31         while(m--)
    32         {
    33             cin>>p1>>p2 ;
    34             if(!map[p1][p2])
    35             indegree[p2]++ ;
    36             map[p1][p2] = 1 ;
    37         }
    38         topological(n) ;
    39         for(int i=1; i<n; i++)
    40         cout<<ans[i]<<" " ;
    41         cout<<ans[n]<<endl ;
    42     }
    43     return 0 ;
    44 }

    这样做比一般的做法要省时

    下面是一般的做法:

    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 int ans[555];
     4 int map[505][505];
     5 int indegree[505];
     6 int topological(int n)
     7 {
     8     int i,j;
     9     int k;
    10     k=0;
    11     while(k<n)
    12     {
    13         for(i=1;i<=n;i++)
    14         {
    15             if(indegree[i]==0)
    16             {
    17                 indegree[i] = - 1 ;
    18                 ans[k++]=i;
    19                 for(j=1;j<=n;j++)
    20                 if(map[i][j])
    21                 {
    22                     indegree[j]--;
    23                     break;
    24                 }
    25             }
    26         }
    27     }
    28     return 0 ;
    29 }
    30 int main()
    31 {
    32     int n,m;
    33     int i;
    34     int a,b;
    35     while(scanf("%d%d",&n,&m)!=EOF)
    36     {
    37         memset(map,0,sizeof(map));
    38         memset(indegree,0,sizeof(indegree));
    39         for(i=1;i<=m;i++)
    40         {
    41             scanf("%d%d",&a,&b);
    42             if(!map[a][b])
    43             {
    44                 map[a][b]=1;
    45                 indegree[b]++;
    46             }
    47         }
    48         topological(n);
    49         for(i=0;i<n-1;i++)  printf("%d ",ans[i]);
    50         printf("%d\n",ans[i]);
    51     }
    52     return 0;
    53 }

    结果:Time Limit Exceeded

  • 相关阅读:
    【转】使用TortoiseSVN搭建本地的版本控制库
    操作系统的大端小端
    从《王者荣耀》谈游戏的帧同步
    二叉搜索树的第K大节点
    Mysql千万级大表优化
    海量数据存储方案
    递归函数思维
    time_wait的快速回收和重用
    Nginx配置反向代理服务器
    MySQL-怎样使update操作sleep一段时间
  • 原文地址:https://www.cnblogs.com/yelan/p/2934295.html
Copyright © 2020-2023  润新知