拓扑排序

来源:互联网 发布:mac excel 数据分析 编辑:程序博客网 时间:2024/06/14 18:07

http://bailian.openjudge.cn/practice/4084/
总时间限制: 1000ms 内存限制: 65536kB
描述
给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前。

输入
若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号。
v<=100, a<=500
输出
若干个空格隔开的顶点构成的序列(用小写字母)。
样例输入
6 8
1 2
1 3
1 4
3 2
3 5
4 5
6 4
6 5

样例输出
v1 v3 v2 v6 v4 v5

思路
1. 结点struct node设置成员:
父结点个数、 子结点个数 、 子结点序号数组
2. 把结点存放在数组中 node[], 数组的编号天然与结点的序号对应
3. 输入并且记录好数组node[]当中每一个node的所有成员
4. 用cNum记录打印的结点个数,在while (cNum

#include<iostream>#include<cstring>using namespace std;struct node // 每一个结点记录: 父亲个数,儿子个数,儿子序号的数组{    int farNum;    int sonNum;    int son[110];};node v[110];bool visit[110] = {0};int main(){    int m,n;    cin>>m>>n;    int p,q;    memset(v,0,sizeof(v)); // node当中的所有成员都设置成为0    for(int i=1;i<=n;i++)    {        cin>>p>>q;        v[p].son[v[p].sonNum] = q;        v[p].sonNum ++;        v[q].farNum ++;    }    int cNum = 0;    while(cNum<m) // cNum来记录打印的结点个数,其最大值是确定的    {        for(int i=1;i<=m;i++)            if(v[i].farNum == 0 && !visit[i])            {                cout<<"v"<<i<<" ";                visit[i] = true;                for(int j=0;j<v[i].sonNum;j++)                    v[v[i].son[j]].farNum--;                cNum ++;                break; // 找到一个可以打印的,就推出该循坏,在进行下一轮的while循环            }    }    cout<<endl;    return 0;}
0 0
原创粉丝点击