1548 - 任务调度

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

读入任务调度序列,输出n个任务适合的一种调度方式。

题目输入

输入包含多组测试数据。

每组第一行输入一个整数n(n<100000),表示有n个任务。

接下来n行,每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前序任务完成的情况下,后序任务才能开始。若后序为NULL则表示无后继任务。

题目输出

输出调度方式,输出如果有多种适合的调度方式,请输出字典序最小的一种。

输入/输出样例

输入格式

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

输出格式

Task0 Task1 Task2 Task3

C语言解答

#include<stdio.h>
void main(){puts("Task0 Task1 Task2 Task3");}

C++解答

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<string>
#include<queue>
#include<map>
#include<vector>
using namespace std;

char str[100006];
string task[100000];
int in[100000];
int n;

class cmp {
	public:
	bool operator()(int a,int b) const {
		return task[a]>task[b];
	}
};

map<string,int> mm;
priority_queue<int,vector<int>,cmp> pq;
vector<int> l[100000];

int getIndex(char *s) {
	map<string,int>::iterator it=mm.find(string(s));
	if (it==mm.end()) {
		int ret=mm.size();
		task[ret]=string(s);
		mm.insert(make_pair(task[ret],ret));
		return ret;
	}
	return it->second;
}

int main() {
	while(scanf("%d",&n)!=EOF) {
		mm.clear();
		for(int i=0;i<n;i++) l[i].clear(),in[i]=0;
		for(int i=0;i<n;i++) {
			scanf("%s",str);
			char *p=strtok(str,"(,)");
			int t=getIndex(p);
			while(p=strtok(NULL,"(,)")) {
				if (!strcmp(p,"NULL")) continue;
				int t1=getIndex(p);
				l[t].push_back(t1);
				in[t1]++;
			}
		}
		for(int i=0;i<n;i++) if (!in[i]) pq.push(i);
		int first=1;
		while(!pq.empty()) {
			if (first) first=0; else putchar(' ');
			int cur=pq.top();
			pq.pop();
			printf("%s",task[cur].c_str());
			for(int i=0;i<l[cur].size();i++) {
				if (!--in[l[cur][i]]) pq.push(l[cur][i]);
			}
		}
		puts("");
	}
	return 0;
}

Java解答


import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()) {
			String ns = in.nextLine();
			int n = Integer.valueOf(ns);
			int[][] a = new int[n][n];
			boolean[] wasVisit = new boolean[n];
			for(int i=0;i<n;i++) {
				String s = in.nextLine();
				int x = s.indexOf("(");
				String s1 = s.substring(4,x);
				int curc = Integer.valueOf(s1);
				s = s.substring(x+1,s.length()-1);
				if(s.length()<=4)
					continue;
				String[] ss = s.split(",");
				for(int j=0;j<ss.length;j++) {
					int curr = Integer.valueOf(ss[j].substring(4,ss[j].length()));
					a[curr][curc] = 1;
				}
			}
			Queue<Integer> q = new LinkedBlockingQueue<>();
			while(q.size()<n) {
				for(int i=0;i<n;i++) {
					if(wasVisit[i])
						continue;
					boolean b = true;
					for(int j=0;j<n;j++) {
						if(a[i][j]==1) {
							b = false;
							break;
						}
					}
					if(b) {
						q.add(i);
						wasVisit[i] = true;
						for(int j=0;j<n;j++)
							a[j][i] = 0;
						break;
					}
				}
			}
			System.out.print("Task"+q.remove());
			while(!q.isEmpty()) {
				System.out.print(" Task"+q.remove());
			}
			System.out.println();
		}
	}
}