列表

详情


NC206078. 烦人的依赖

描述

Ubuntu20.04 正式发布了,ZLS 是一个作死小能手,于是他决定尝试一下这个船新版本。好不容易装完系统,ZLS 想要给他的系统装一些常用的软件。众所周知,在 Linux 装软件会遇到各种奇奇怪怪的依赖问题(所谓依赖问题就是若A依赖B,则B要先与A安装)。ZLS 对此不厌其烦,因此他想知道他要用什么顺序安装软件,可以一次安装成功呢?
Tips: ZLS 还有一个癖好,他喜欢先安装字典序小的软件。

输入描述

第一行包含一个正整数 T 表示数据组数。
每组数据的第一行包 n 和 m, 表示有 n 个软件,m 个依赖关系。
接下来的一行包含 n 个软件名(软件名仅包含小写字母 a-z )
接下来的 m 行每行有两个软件名 s 和 t,表示 t 依赖 s ,即 s 要在 t 之前安装。
数据保证:

输出描述

共 T 组输出,每组输出先输出一行 Case #%d: ,%d 替换为当前输出的组数。
接下来是 n 行,按照安装的顺序输出。
如果无法进行安装,输出 Impossible (注意大小写)。

示例1

输入:

2
4 2
a b c d
a b
b c
3 3
a b c
a b
b c
c a

输出:

Case #1:
a
b
c
d
Case #2:
Impossible

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 754ms, 内存消耗: 6520K, 提交时间: 2021-12-01 21:27:42

#include<bits/stdc++.h>
using namespace std;

int n,m,t;
int main() {
	cin>>t;
	for(int i=1; i<=t; i++) {
		cin>>n>>m;
		map<string,int> ma;
		vector<int>ve[30010],ans;
		int ind[30010]= {};
		string s,a,b,d[30010];
		for(int i=0; i<n; i++) {
			cin>>s;
			d[i]=s;
		}
		sort(d,d+n);
		for(int i=0; i<n; i++)ma[d[i]]=i;
		for(int i=0; i<m; i++) {
			cin>>a>>b;
			int x=ma[a],y=ma[b];
			ve[x].push_back(y);
			ind[y]++;
		}
		priority_queue<int>qu;
		for(int i=0; i<n; i++)
			if(!ind[i])qu.push(-i);
		while(qu.size()) {
			int k=-qu.top();
			ans.push_back(k);
			qu.pop();
			for(int i=0; i<ve[k].size(); i++) {
				ind[ve[k][i]]--;
				if(!ind[ve[k][i]])qu.push(-ve[k][i]);
			}
		}
		cout<<"Case #"<<i<<":"<<endl;
		if(ans.size()<n)puts("Impossible");
		else {
			for(int i=0; i<ans.size(); i++)
				cout<<d[ans[i]]<<endl;
		}
	}

	return 0;
}

上一题