标签:
题意 : 给你m个二元关系, 问是否可以确定各个节点的先后关系;
思路: 拓扑排序, 判断是否有环;
#include<bits/stdc++.h> using namespace std; const int maxn = 1e4 + 131; struct Node{ int nxt, to; }edge[maxn]; int Head[maxn], tot; void AddEdge(int From, int To) { edge[tot].to = To; edge[tot].nxt = Head[From]; Head[From] = tot++; } map<string, int> StoI; string a, b; int Vis[maxn];/// 记录节点的访问次数 void TopSort(int n) { queue<int> qu; int lest = n; for(int i = 1; i <= n; ++i) { if(!Vis[i]) qu.push(i); } while(!qu.empty()) { int u = qu.front(); qu.pop(); --lest; for(int i = Head[u]; i != -1; i = edge[i].nxt) { int v = edge[i].to; --Vis[v]; if(!Vis[v]) qu.push(v); } } if(lest) puts("No"); else puts("Yes"); } int main() { int t; scanf("%d",&t); for(int kase = 1; kase <= t; ++kase) { int m; scanf("%d",&m); StoI.clear(); memset(Head,-1,sizeof(Head)); tot = 0; int n = 0; memset(Vis, 0, sizeof(Vis)); for(int i = 1; i <= m; ++i) { cin >> a >> b; if(StoI.find(a) == StoI.end()) StoI[a] = ++n; if(StoI.find(b) == StoI.end()) StoI[b] = ++n; ++Vis[StoI[b]]; AddEdge(StoI[a], StoI[b]); } printf("Case %d: ",kase); TopSort(n); } return 0; }
标签:
原文地址:http://www.cnblogs.com/aoxuets/p/4909613.html