赞
踩
竞赛图判三元环的正确解法是,如果形成了环,那么一定存在三元环。
所以,直接拓扑判环就可以了,当然不嫌麻烦的话写Tarjan也是可以的。
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- #include <string>
- #include <cstring>
- #include <algorithm>
- #include <limits>
- #include <vector>
- #include <stack>
- #include <queue>
- #include <set>
- #include <map>
- #include <bitset>
- //#include <unordered_map>
- //#include <unordered_set>
- #define lowbit(x) ( x&(-x) )
- #define pi 3.141592653589793
- #define e 2.718281828459045
- #define INF 0x3f3f3f3f
- #define HalF (l + r)>>1
- #define lsn rt<<1
- #define rsn rt<<1|1
- #define Lson lsn, l, mid
- #define Rson rsn, mid+1, r
- #define QL Lson, ql, qr
- #define QR Rson, ql, qr
- #define myself rt, l, r
- using namespace std;
- typedef unsigned long long ull;
- typedef unsigned int uit;
- typedef long long ll;
- const int maxN = 2e3 + 7;
- int mp[maxN][maxN], N, du[maxN];
- queue<int> Q;
- inline bool tp_sort()
- {
- while(!Q.empty()) Q.pop();
- int inque = 0;
- for(int i=1; i<=N; i++) if(!du[i]) Q.push(i);
- while(!Q.empty())
- {
- inque++; int u = Q.front(); Q.pop();
- for(int i=1; i<=N; i++)
- {
- if(mp[u][i])
- {
- du[i]--;
- if(!du[i])
- {
- Q.push(i);
- }
- }
- }
- }
- return inque == N;
- }
- int main()
- {
- int T; scanf("%d", &T);
- char s[maxN];
- for(int Cas=1; Cas <= T; Cas++)
- {
- scanf("%d", &N);
- for(int i=1; i<=N; i++) du[i] = 0;
- for(int i=1; i<=N; i++)
- {
- scanf("%s", s + 1);
- for(int j=1; j<=N; j++)
- {
- mp[i][j] = s[j] - '0';
- if(mp[i][j]) du[j]++;
- }
- }
- printf("Case #%d: ", Cas); printf(tp_sort() ? "No\n" : "Yes\n");
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。