题意:第一天有n道菜,第二天有m道菜,给出第一天每道菜跟第二天每道菜比较的结果,存在“=”,“<”,“>”三种结果,根据该结果对所有菜进行一个等级的划分,并要求菜的最大等级要尽量小。
题解:乍一看蛮像拓扑排序的,其实就是拓扑排序,只不过存在“=”这种比较结果,不过也很好处理,根据并查集将=的划分在同一个生成树里面,即利用tarzan缩点,最后跑一遍拓扑排序就好了。
hint:不知道为啥这个拓扑排序我用queue就WA用stack就AC,很奇怪。
附上ACcode:
#include <bits/stdc++.h>
#define FOPI freopen("INPUT.TXT", "r", stdin)
#define DOPI freopen("OUTPUT.TXT", "w", stdout)
#define FOR(i, x, y) for(int i = x; i <= y; i ++)
#define ROF(i, x, y) for(int i = x; i >= y; i --)
using namespace std;
typedef long long int ll;
const int ind=0x3f3f3f3f,N=1e3+10;
int f[N*N];
char ch[N][N];
int n,m;
int getf(int x){
return f[x]==x?x:f[x]=getf(f[x]);}
vector<int> v[N*N];
int cnt[N*N];
int book[N*N];
int ans[N*N];
void dfs()
{
stack<int> q;
for(int i=1;i<=<