12_3拓扑排序

落花浮王杯 提交于 2020-01-20 15:29:29

任务调度:

从task.in 文件中读入任务调度序列,输出n个任务适合的一种调度方式到task.out中。每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前序任务完成的情况下,后序任务才能开始。若后序为NULL则表示无后继任务。

Sample Input:

 Task0(Task1,Task2)                
 Task1(Task3)
 Task2(NULL)
 Task3(NULL)      

Sample Output:

 Task0 Task1 Task3 Task2

知识点:

从字符串中提取数字
拓扑排序

AC代码

#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
#define maxn 1000

using namespace std;

vector<int>G[maxn];
int n=0;
int InDegree[maxn]={0};

void TopoSort()
{
    int Q[maxn];
    int front=-1,rear=-1;
    int u;
    for(int i=0;i<n;i++)
    {
        if(InDegree[i]==0)
        {
            Q[++rear]=i;
        }
    }//度为0就入队
    while(front<rear)
    {
        u=Q[++front];
        printf("Task%d ",u);//出队并打印
        for(int i=0;i<G[u].size();i++)
        {
            int v=G[u][i];//u指向结点
            InDegree[v]--;//
            if(InDegree[v]==0)
            {
                Q[++rear]=v;//
            }
        }
    }
}


int main()
{
    freopen("task.in","r",stdin);
    freopen("task.out","w",stdout);
    char s[maxn];
    int flag1,flag2;
    int ori,des;
    while(gets(s)!=NULL)
    {
        flag1=0;//区分while循环内得到的ori还是des
        flag2=0;//标志是否进入过while循环
        for(int i=0;i<strlen(s);i++)
        {
            ori=0;
            des=0;//每次开始循环前ori,des,flag2初始化
            while(i<strlen(s)&&s[i]>='0'&&s[i]<='9')//获取数字
            {
                if(!flag2)
                {
                    flag2=1;
                    n++;//得到个数
                }
                if(!flag1)
                {
                    ori=ori*10+s[i]-'0';
                }
                else
                {
                    des=des*10+s[i]-'0';
                    InDegree[des]++;
                    G[ori].push_back(des);
                }
                i++;
            }
            if(flag2)flag1=1;//第一次循环结束后得到ori
        }
    }//建立图
    TopoSort();

}



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!