拓扑排序

先判断能否进行拓扑排序,本质就是检查是否存在环
统计入度的情况,将入度为0的,加入队列中。

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

int main(){
    int N,M,in_degree[100],a,b,nodecount;
    vector<int> edge[100*99/2];
    queue<int> Q;
    while(cin>>N>>M&&N){
        //初始化
        for(int m=0;m<N;m++){
            in_degree[m]=0;
            edge[m].clear();
        }
        while(!Q.empty()) Q.pop();
        nodecount=0;
        //读入数据
        for(int i=0;i<M;i++){
            cin>>a>>b;
            edge[a].push_back(b);
            in_degree[b]++;
        }
        for(int j=0;j<N;j++){
            if(in_degree[j]==0)
                Q.push(j);
        }
        while(!Q.empty()){
            int node = Q.front();
            Q.pop();
            nodecount++;
            for(int k=0;k<edge[node].size();k++){
                in_degree[edge[node][k]]--;
                if(in_degree[edge[node][k]]==0){
                    Q.push(edge[node][k]);
                }
            }
        }
        if(nodecount==N)
            printf("YES\n");
        else
            printf("NO\n");

    }
    return 0;
}

依次删除入度为0的节点

如果要排序,并且按照某顺序,可以采用优先队列

另外一种变体
产生冠军

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<set>
#include<string>
#include<map>
using namespace std;

int main(){
    int n,sum;
    string p1,p2;
    map<string ,vector<string > > edge_map;
    map<string,int> indegree;
    while(cin>>n&&n){
        int nodecount = 0;
        edge_map.clear();
        indegree.clear();
        for(int i=0;i<n;i++){
            cin>>p1>>p2;
            edge_map[p1].push_back(p2);
            if(indegree.find(p1)==indegree.end())
                indegree[p1]=0;
            if(indegree.find(p2)==indegree.end())
                indegree[p2]=0;
            indegree[p2]++;
        }
        map<string,int>::iterator it;
        for(it=indegree.begin();it!=indegree.end();it++){
            if(it->second==0){
                nodecount ++;
            }
        }
        if(nodecount==1)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

以上代码需要注意的是map的查找和遍历。

阅读更多

扫码向博主提问

去开通我的Chat快问

nghuyong

非学,无以致疑;非问,无以广识
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nghuyong/article/details/73800125
个人分类: 算法 机试
想对作者说点什么? 我来说一句

拓扑排序 整体 拓扑排序

2010年01月15日 1.1MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭