题目:
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个字母能够直达多少字母。
然后按照顺序输出就行了,超级简洁。