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個字母能夠直達多少字母。

然後按照順序輸出就行了,超級簡潔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章