拓扑排序

2021-03-29 15:27

阅读:592

标签:open   tac   pre   one   amp   com   图片   拓扑排序   out   

1.家谱树

寻寻有一个大家庭,辈分关系很混乱,请你帮他梳理一下家庭成员的关系。

输入:

第一行n,表示共5个人。

接下来的n行,第i行表示第i个人的孩子。

每行以0结束。

输出:

一行序列,空格隔开,使得每个人的后辈都比那个人后出现。

spj

技术图片技术图片
#include
#include
#include
#include
#include
#include
#include
#includeusing namespace std;
int n,cnt,ru[10005],hd[10005],ans, x,t,y;
stackint> q;
struct Edge{
    int to, nxt;
}edge[1000005];
void add(int u, int v){
    cnt++;
    edge[cnt].to = v;
    edge[cnt].nxt = hd[u];
    hd[u] = cnt;
}
int main(){
    scanf("%d",&n);
    for(int i = 1; i ){
        while(~scanf("%d",&y)){
            if(y == 0) break;
            add(i,y);
            ru[y]++;
        }
    }
    int mx = 0;
    for(int i = 1; i )
        if(ru[i] == 0){
             q.push(i);
        }
    while(!q.empty()){
        int u = q.top(); q.pop();
        printf("%d ",u);
        for(int i = hd[u]; i; i = edge[i].nxt){
            int v = edge[i].to;
            ru[v]--;
            if(!ru[v]){
                q.push(v);
            }
        }
    }
    return 0;
}
/*
5
0
4 5 0
1 0
5 3 0
3 0
*/
View Code

 

P1113 杂务

技术图片

题解:递推关系

 

技术图片技术图片
#include
#include
#include
#include
#include
#include
#include
#includeusing namespace std;
int n,cnt,at[10005],ru[10005],hd[10005],ans, x,t,y, f[10005];
stackint> q;
struct Edge{
    int to, nxt;
}edge[1000005];
void add(int u, int v){
    cnt++;
    edge[cnt].to = v;
    edge[cnt].nxt = hd[u];
    hd[u] = cnt;
}
int main(){
    scanf("%d",&n);
    for(int i = 1; i ){
        scanf("%d%d",&x,&t);
        at[x] = t;
        while(~scanf("%d",&y)){
            if(y == 0) break;
            add(y,x);
            ru[x]++;
        }
    }
    int mx = 0;
    for(int i = 1; i )
        if(ru[i] == 0){
            q.push(i);
            f[i] = at[i];
        }
    while(!q.empty()){
        int u = q.top(); q.pop();
        for(int i = hd[u]; i; i = edge[i].nxt){
            int v = edge[i].to;
            ru[v]--;
            if(!ru[v]){
                q.push(v);
            }
            f[v] = max(f[v], f[u] + at[v]);
        }
    }
    for(int i = 1; i )
        ans = max(ans, f[i]);
    printf("%d\n",ans);
    return 0;
}

// #include// #include// #include// #include// #include
// #include// #include// #include// using namespace std;
// int n,cnt,at[10005],ru[10005],hd[10005],ans, x,t,y, vis[10005];
// stack q;
// struct Edge{
//     int to, nxt;
// }edge[1000005];
// void add(int u, int v){
//     cnt++;
//     edge[cnt].to = v;
//     edge[cnt].nxt = hd[u];
//     hd[u] = cnt;
// }
// int main(){
//     scanf("%d",&n);
//     for(int i = 1; i //         scanf("%d%d",&x,&t);
//         at[x] = t;
//         while(~scanf("%d",&y)){
//             if(y == 0) break;
//             add(y,x);
//             ru[x]++;
//         }
//     }
//     int fl;
//     while(1){
//         int mx = 0, fl = 0;
//         cout//         for(int u = 1; u //             if(!ru[u] && !vis[u]){
//                 q.push(u);
//                 if(at[u] > mx) mx = at[u];
//                 fl = 1;
//                 vis[u] = 1;
//                 cout//             }
//         }
//
//         cout//         if(!fl) break;
//         ans += mx;
//         cout//         cout//         while(!q.empty()){
//             int u = q.top(); q.pop();
//             for(int i = hd[u]; i; i = edge[i].nxt){
//                 int v = edge[i].to;
//                 ru[v]--;
//                 cout//             }
//         }
//         cout//     }
//     printf("%d\n",ans);
//     return 0;
// }
View Code

 

拓扑排序

标签:open   tac   pre   one   amp   com   图片   拓扑排序   out   

原文地址:https://www.cnblogs.com/caterpillor/p/13604941.html


评论


亲,登录后才可以留言!