任务调度:
从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();
}
来源:CSDN
作者:查立军
链接:https://blog.csdn.net/weixin_43370733/article/details/104049833