2019 ICPC Malaysia National J.Kitchen Plates

题目:
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个字母能够直达多少字母。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值