拓扑排序【kahn算法及dfs的拓扑排序】

家谱树


有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的孩子的信息。输出一个序列,使得每个人的后辈都比那个人后列出
Sample Input
5
0
4 5 1 0
1 0
5 3 0
3 0

样例输出 Sample Output
2 4 5 3 1
【因为需输出字典序最小的因而要使用优先队列】

#include
#include
#include
using namespace std;
vector<int> G[110];
int r[110];
int n;
int main(){
    cin>>n;
    for (int i=1;i<=n;i++){
        int v;
        while (cin>>v&&v){
            G[i].push_back(v);
            r[v]++;            //计算入度
        }
    }
    priority_queue<int,vector<int>,greater<int> > pq;
    for (int i=1;i<=n;i++){
        if (r[i]==0) pq.push(i);
    }
    while (!pq.empty()){
        int u=pq.top();                             
        pq.pop();
        cout<" ";
        for (int i=0;iint v=G[u][i];
            r[v]--;                       //删边
            if (r[v]==0) pq.push(v);       //加入输出队列
        }
    }
    return 0;
}

奖学金


题目大意,输入员工a,b要求a比b工资要高【至少高1】,
每人至少100元,求使得总奖金最少的方案
样例输入 Sample Input
2 1
1 2

样例输出 Sample Output
201
dfs拓扑很水orz

#include
#include
using namespace std;
int n,m;
const int maxn=50010;
vector<int> G[maxn];
int f[maxn];
int book[maxn];

bool dfs(int u){
    book[u]=-1;//-1表示正在搜索 
    for (int i=0;iint v=G[u][i];
        if (book[v]==-1) return false;     
        if (book[v]==0){
            if (!dfs(v)) return false;
            f[u]=max(f[u],f[v]+1);  //取大值 
        }
        else f[u]=max(f[u],f[v]+1);
    }
    book[u]=1;
    return true;
}

int main(){
    cin>>n>>m;
    for (int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        G[u].push_back(v);
    }
    for (int i=1;i<=n;i++)
        f[i]=100;
    bool flag=true;
    int ans=0;
    for (int i=1;i<=n;i++){
        if (!book[i]){
            if (!dfs(i)){
                flag=false;   //形成环,错误 
                break;
            } 
        }
        ans+=f[i];     //累加 
    }
    if (flag) cout<else cout<<"Poor Xed";
    return 0;
}

你可能感兴趣的:(图论)