zoukankan      html  css  js  c++  java
  • 拓扑排序

    poj http://poj.org/problem?id=2367

     1 #include<cstdio>
     2 class Toposort { ///拓扑排序(矩阵)O(MV^2)
     3     static const int MV=1e2+10;///点的个数
     4     bool mat[MV][MV];
     5     int n,ret[MV],d[MV],i,j,k;
     6 public:
     7     void init(int tn) {///传入点数,点下标0开始
     8         n=tn;
     9         for(i=0; i<n; i++)
    10             for(j=0; j<n; j++)
    11                 mat[i][j]=false;
    12     }
    13     void add(int u,int v) {
    14         mat[u][v]=true;
    15     }
    16     bool solve() {///如果无法完成排序,返回flase,否则返回true,ret返回有序点列
    17         for (i=0; i<n; i++)
    18             for (d[i]=j=0; j<n; d[i]+=mat[j++][i]);
    19         for (k=0; k<n; ret[k++]=i) {
    20             for (i=0; d[i]&&i<n; i++);
    21             if (i==n) return false;
    22             for (d[i]=-1,j=0; j<n; j++)
    23                 d[j]-=mat[i][j];
    24         }
    25         return true;
    26     }
    27     int getvalue(int id) {///0~n-1中存着字典序最小的序列
    28         return ret[id];
    29     }
    30 } g;
    31 int main() {
    32     int n,m,u,v;
    33     while(~scanf("%d",&n)) {
    34         g.init(n);
    35         for(int i=0;i<n;i++){
    36             while(true){
    37                 scanf("%d",&u);
    38                 if(!u) break;
    39                 g.add(i,u-1);
    40             }
    41         }
    42         g.solve();
    43         for(int i=0;i<n;i++){
    44             printf("%d%c",g.getvalue(i)+1,i==n-1?'
    ':' ');
    45         }
    46     }
    47     return 0;
    48 }
    View Code

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

     1 #include<cstdio>
     2 class Toposort { ///拓扑排序(矩阵)O(MV^2)
     3     static const int MV=5e2+10;///点的个数
     4     bool mat[MV][MV];
     5     int n,ret[MV],d[MV],i,j,k;
     6 public:
     7     void init(int tn) {///传入点数,点下标0开始
     8         n=tn;
     9         for(i=0; i<n; i++)
    10             for(j=0; j<n; j++)
    11                 mat[i][j]=false;
    12     }
    13     void add(int u,int v) {
    14         mat[u][v]=true;
    15     }
    16     bool solve() {///如果无法完成排序,返回flase,否则返回true,ret返回有序点列
    17         for (i=0; i<n; i++)
    18             for (d[i]=j=0; j<n; d[i]+=mat[j++][i]);
    19         for (k=0; k<n; ret[k++]=i) {
    20             for (i=0; d[i]&&i<n; i++);
    21             if (i==n) return false;
    22             for (d[i]=-1,j=0; j<n; j++)
    23                 d[j]-=mat[i][j];
    24         }
    25         return true;
    26     }
    27     int getvalue(int id) {
    28         return ret[id];
    29     }
    30 } g;
    31 int main() {
    32     int n,m,u,v;
    33     while(~scanf("%d%d",&n,&m)) {
    34         g.init(n);
    35         while(m--){
    36             scanf("%d%d",&u,&v);
    37             g.add(u-1,v-1);
    38         }
    39         g.solve();
    40         for(int i=0;i<n;i++){
    41             printf("%d%c",g.getvalue(i)+1,i==n-1?'
    ':' ');
    42         }
    43     }
    44     return 0;
    45 }
    View Code
  • 相关阅读:
    第十四周课程总结&实验报告(简单记事本的实现)
    第十三周课程总结
    第十二周
    第十一周课程总结
    第十周课程总结
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周课程总结&实验报告(五)
    第六周&java实验报告四
    课程总结
  • 原文地址:https://www.cnblogs.com/gaolzzxin/p/4476102.html
Copyright © 2011-2022 走看看