码迷,mamicode.com
首页 > 编程语言 > 详细

拓扑排序

时间:2020-09-16 12:29:14      阅读:33      评论:0      收藏:0      [点我收藏+]

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

1.家谱树

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

输入:

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

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

每行以0结束。

输出:

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

spj

技术图片
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<stack>
using namespace std;
int n,cnt,ru[10005],hd[10005],ans, x,t,y;
stack<int> 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 <= n; i++){
        while(~scanf("%d",&y)){
            if(y == 0) break;
            add(i,y);
            ru[y]++;
        }
    }
    int mx = 0;
    for(int i = 1; i <= n; 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<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<stack>
using namespace std;
int n,cnt,at[10005],ru[10005],hd[10005],ans, x,t,y, f[10005];
stack<int> 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 <= n; 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 <= n; 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 <= n; i++)
        ans = max(ans, f[i]);
    printf("%d\n",ans);
    return 0;
}

// #include<iostream>
// #include<cstdio>
// #include<cmath>
// #include<cstring>
// #include<algorithm>
// #include<queue>
// #include<cstdlib>
// #include<stack>
// using namespace std;
// int n,cnt,at[10005],ru[10005],hd[10005],ans, x,t,y, vis[10005];
// stack<int> 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 <= n; 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<<"u:"<<endl;
//         for(int u = 1; u <= n; u++){
//             if(!ru[u] && !vis[u]){
//                 q.push(u);
//                 if(at[u] > mx) mx = at[u];
//                 fl = 1;
//                 vis[u] = 1;
//                 cout<<u<<" ";
//             }
//         }
//
//         cout<<endl;
//         if(!fl) break;
//         ans += mx;
//         cout<<"mx:"<<mx<<" ans: "<<ans<<endl;
//         cout<<"v:"<<endl;
//         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<<v<<" ";
//             }
//         }
//         cout<<endl;
//     }
//     printf("%d\n",ans);
//     return 0;
// }
View Code

 

拓扑排序

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

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!