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

     
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxv = 100010;
     4 const int maxe = 500010;
     5 struct Edge{
     6     int v, nxt;
     7     Edge(){}
     8     Edge(int v, int nxt):v(v), nxt(nxt){}
     9 }e[maxe<<1];
    10 int head[maxv], cnt;
    11 void init(){
    12     memset(head, -1, sizeof head);
    13     cnt = 0;
    14 }
    15 void add(int u, int v){
    16     e[cnt] = Edge(v, head[u]);
    17     head[u] = cnt++;
    18 }
    19 
    20 int ind[maxv];
    21 int n, m;
    22 int res;
    23 int top(){
    24     queue<int> q;
    25     for(int i = 1; i <= n; i++) if(ind[i] == 0) q.push(i);
    26     while(!q.empty()){
    27         int u = q.front(); q.pop();
    28         res++;
    29         for(int i = head[u]; ~i; i = e[i].nxt){
    30             int v = e[i].v;
    31             ind[v]--;
    32             if(ind[v] == 0) q.push(v);
    33         }
    34     }
    35     return res == n;
    36 }
    37 int main(){
    38     int t;
    39     scanf("%d", &t);
    40     while(t--){
    41         scanf("%d %d", &n, &m);
    42         memset(ind, 0, sizeof ind);
    43         res = 0;
    44         init();
    45         int u, v;
    46         for(int i = 0; i < m; i++){
    47             scanf("%d %d", &u, &v);
    48             add(u, v);
    49             ind[v]++;
    50         }
    51         if(top()) puts("Correct");
    52         else puts("Wrong");
    53     }
    54 }
    View Code
     
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxv = 100010;
     4 const int maxe = 500010;
     5 const int mod = 142857;
     6 struct Edge{
     7     int v, nxt;
     8     Edge(){}
     9     Edge(int v, int nxt):v(v), nxt(nxt){}
    10 }e[maxe<<1];
    11 int head[maxv], cnt;
    12 void init(){
    13     memset(head, -1, sizeof head);
    14     cnt = 0;
    15 }
    16 void add(int u, int v){
    17     e[cnt] = Edge(v, head[u]);
    18     head[u] = cnt++;
    19 }
    20 
    21 int ind[maxv];
    22 int n, m;
    23 int ill[maxv];
    24 void top(){
    25     queue<int> q;
    26     for(int i = 1; i <= n; i++) if(ind[i] == 0) q.push(i);
    27     while(!q.empty()){
    28         int u = q.front();
    29         q.pop();
    30         for(int i = head[u]; ~i; i = e[i].nxt){
    31             int v = e[i].v;
    32             ill[v] = (ill[v] + ill[u]) % mod;
    33             ind[v]--;
    34             if(!ind[v]) q.push(v);
    35         }
    36     }
    37 }
    38 int main(){
    39     int k, x;
    40     while(scanf("%d %d %d", &n, &m, &k) != EOF){
    41         memset(ill, 0, sizeof ill);
    42         memset(ind, 0, sizeof ind);
    43         init();
    44         for(int i = 0; i < k; i++) scanf("%d", &x), ill[x] = 1;
    45         for(int i = 0; i < m; i++){
    46             int u, v;
    47             scanf("%d %d", &u, &v);
    48             add(u, v);
    49             ind[v]++;
    50         }
    51         top();
    52         int ans = 0;
    53         for(int i = 1; i <= n; i++){
    54             ans = (ans + ill[i]) % mod;
    55         }
    56         printf("%d
    ", ans);
    57     }        
    58 }
    View Code
    拓扑排序 + 支配树
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxv = 100010;
     4 const int maxe = maxv * 10;
     5 int temp[11], dep[maxv], par[maxv];
     6 struct Edge{
     7     int v, nxt;
     8     Edge(){}
     9     Edge(int v, int nxt):v(v), nxt(nxt){}
    10 }e[maxe];
    11 int head[maxv], cnt;
    12 void init(){
    13     memset(head, -1, sizeof head);
    14     cnt = 0 ;
    15 }
    16 void add(int u, int v){
    17     e[cnt] = Edge(v, head[u]);
    18     head[u] = cnt++;
    19 }
    20 vector<int> g[maxv];
    21 int ind[maxv];
    22 int n, ans;
    23 
    24 int lca(int u){
    25     int md = -1;
    26     for(int i = 0; i < g[u].size(); i++){
    27         temp[i] = g[u][i];
    28         if(md == -1 || dep[temp[i]] < md){
    29             md = dep[temp[i]];
    30         } 
    31     }
    32     for(int i = 0; i < g[u].size(); i++){
    33         while(dep[temp[i]] > md) temp[i] = par[temp[i]];
    34     }
    35     while(1){
    36         int i = 1;
    37         for(; i < g[u].size(); i++){
    38             if(temp[i] != temp[0]) break;
    39         }
    40         if(i == g[u].size()) break;
    41         for(int i = 0; i < g[u].size(); i++){
    42             temp[i] = par[temp[i]];
    43         }
    44     }
    45     return temp[0];
    46 }
    47 void top(){
    48     queue<int> q;
    49     for(int i = 0; i <= n; i++) if(ind[i] == 0) q.push(i);
    50     while(!q.empty()){
    51         int u = q.front(); q.pop();
    52         for(int i = head[u]; ~i; i = e[i].nxt){
    53             int v = e[i].v;
    54             ind[v]--;
    55             if(ind[v] == 0){
    56                 par[v] = lca(v);
    57                 dep[v] = dep[par[v]] + 1;
    58                 if(par[v] == 0) ans++;
    59                 q.push(v);
    60             }
    61         }
    62     }
    63 }
    64 int main(){
    65     while(scanf("%d", &n) != EOF){
    66         init();
    67         memset(ind, 0, sizeof ind);
    68         for(int j = 1; j <= n; j++) g[j].clear();
    69         for(int i = 1; i <= n; i++){
    70             int k, x;
    71             scanf("%d", &k); 
    72             for(int j = 0; j < k; j++){
    73                 scanf("%d", &x);
    74                 add(x, i);
    75                 ind[i]++;
    76                 g[i].push_back(x);
    77             }
    78         }
    79         ans = 0;
    80         top();
    81         printf("%d
    ", ans);
    82     }
    83 
    84 }
    View Code
  • 相关阅读:
    c基础
    一维数组,字符数组
    循环结构
    分支结构
    结构体
    Python简介和入门
    Python基础(一)
    Markdown 基础学习
    PyCharm 专业版安装
    Python基础(二)
  • 原文地址:https://www.cnblogs.com/yijiull/p/8507191.html
Copyright © 2011-2022 走看看