题意:判断一个有向图是否有环
拓扑排序问题,如果所有结点都入队列,无环
#include <bits/stdc++.h>
using namespace std;
map<string,int> M;
vector<int> g[20005];
int degree[20005];
int main()
{
int T;
scanf("%d", &T);
for(int ca = 1; ca <= T; ca++)
{
M.clear();
int m;
scanf("%d", &m);
for(int i = 0; i <= 2 * m; i++)
g[i].clear(), degree[i] = 0;
for(int i = 0; i < m; i++)
{
string a, b;
cin >> a >> b;
if(!M[a]) M[a] = M.size();
if(!M[b]) M[b] = M.size();
g[M[a]].push_back(M[b]);
degree[M[b]]++;
}
int cnt = M.size();
queue<int> q;
for(int i = 1; i <= M.size(); i++)
if(degree[i] == 0) q.push(i), cnt--;
while(!q.empty())
{
int p = q.front(); q.pop();
for(int i = 0; i < g[p].size(); i++)
{
int k = g[p][i];
degree[k]--;
if(degree[k] == 0) q.push(k), cnt--;
}
}
printf("Case %d: %s\n", ca, cnt == 0 ? "Yes" : "No");
}
return 0;
}