当前位置: 首页 > 工具软件 > Plates > 使用案例 >

2019 ICPC Malaysia National J.Kitchen Plates

孟晋
2023-12-01

题目:
https://codeforc.es/gym/102219/problem/J

题意:给ABCDE 5个盘子的5组比较大小,输出完整大小。

这个题应该蛮经典的,题解清一色都是说拓扑排序,可怜我不知道拓扑排序是啥,于是就用了floyd暴力搞的,然后一比较,代码量还差不多。

源代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <queue>
#include <stack>
#include <map>
//
using namespace std;
const int INF = 0x3f3f3f3f;//1.06e9大小
const int mod1 = 1e9 + 7;
const int mod2 = 998244353;
const int mod3 = 1e9;
const double PI = 3.14159265;
const double eps =1e-8;
typedef unsigned long long ULL;
typedef long long LL;
//
char all[3];
int edge[5][5];
int ans[5];
int main()
{
	for(int time=0;time<5;time++)
	{
		scanf("%s",all);
		if(all[1]=='<')edge[all[2]-'A'][all[0]-'A']=1;
		else edge[all[0]-'A'][all[2]-'A']=1;
	}
	for(int k=0;k<5;++k)
	{
		for(int i=0;i<5;++i)
		{
			for(int j=0;j<5;++j)
			{
				if(edge[i][k]&&edge[k][j])edge[i][j]=1;
			}
		}
	}
	for(int time=0;time<5;time++)
	{
		for(int time1=0;time1<5;time1++)
		{
			if(edge[time][time1]&&edge[time1][time]){printf("impossible\n");return 0;}
		}
	}
	for(int time=0;time<5;time++)
	{
		for(int time1=0;time1<5;time1++)
		{
			if(edge[time][time1])ans[time]++;
		}
	}
	for(int time=0;time<5;time++)
	{
		for(int time1=0;time1<5;time1++)
		{
			if(ans[time1]==time)printf("%c",time1+'A');
		}
	}
	return 0;
}

从上面我用floyd得到点和点之间是否可达,然后用ans[i]表示第i个字母能够直达多少字母。

然后按照顺序输出就行了,超级简洁。

 类似资料:

相关阅读

相关文章

相关问答