3.任务调度:从 task.in文件中读入任务调度序列,输出 n个任务适合的一种调度方式
到 task.out中。每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前
序任务完成的情况下,后序任务才能开始。若后序为 NULL则表示无后继任务。
Sample Input:
Task0(Task1,Task2)
Task1(Task3)
Task2(NULL)
Task3(NULL)
Sample Output:
Task0 Task1 Task3 Task2
思路:不用正则表达式,改用字符自动机,又因进程的偏序关系间无回路,可以使用并查集,避免复杂的图操作。
#include<cstdio>
#include<algorithm>
//#include<algorithm>
using namespace std;
int main()
{
FILE* fp = fopen("task.in","r+");
char ch;
int link[10010],dim[10010] = {0};
fill(link,link +10010,-1);
int work[10010],i = 0,top = -1,maxn = 0;
//fill(link,link +10010,-1);
while(EOF != fscanf(fp,"%c",&ch))
{
if(ch != 'k' && ch != '\n')
continue;
if(ch == 'k')
{
if(i == 0)
{
fscanf(fp,"%d",&work[++top]);
//printf("%d\n",work[top]);
i = 1;
continue;
}
else if(i == 1)
{
fscanf(fp,"%d",&work[++top]);
if(work[top] > maxn) maxn = work[top];
continue;
}
}
else if(ch == '\n')
{
for(int j = 1;j <= top;j++)
{
link[work[j]] = work[0];
dim[work[0]]++;
}
//count = count + top -1;
top = -1;
i = 0;
continue;
}
}
//printf("*****!!!!!****");
//for(int i = 0;i <= 15;i++) printf("%d /",link[i]);
//puts("\n");
//for(int i = 0;i <= 15;i++) printf("%d /",dim[i]);
//printf("%d",maxn);
top = -1;
for(int i = maxn;i >= 0;i--)
{
if(dim[i] == 0) work[++top] = i;
for(int j = i;j >= 0;j--)
{
if(link[i] == j) dim[j]--;
}
}
fp = fopen("task.out","a");
while(top != -1)
{
if(top != 0) fprintf(fp,"Task%d ",work[top--]);
else fprintf(fp,"Task%d",work[top--]);
}
return 0;
}