https://vjudge.net/problem/HDU-4324
题意
每组数据一个n表示n个人,接下n*n的矩阵表示这些人之间的关系,输入一定满足若A不喜欢B则B一定喜欢A,且不会出现A和B相互喜欢的情况,问你这些人中是否存在三角恋。
分析
就是求是否存在三元环。判断图是否存在环,可以使用拓扑排序,排序失败则有环。那么如何判断存在的环是三元环呢?
假设现在存在n元环,在环上有这样相邻的三个元素x--》y--》z。如果是z--》x,那么存在三元环;否则,必存在x--》z,那此时可以把y给忽略,就变成了n-1元环。就这样缩减下去,必定有三元环。因此,此题就是求是否存在环。
#include<iostream> #include<cmath> #include<cstring> #include<queue> #include<vector> #include<cstdio> #include<algorithm> #include<map> #include<set> #include<bitset> #define rep(i,e) for(int i=0;i<(e);i++) #define rep1(i,e) for(int i=1;i<=(e);i++) #define repx(i,x,e) for(int i=(x);i<=(e);i++) #define X first #define Y second #define PB push_back #define MP make_pair #define mset(var,val) memset(var,val,sizeof(var)) #define scd(a) scanf("%d",&a) #define scdd(a,b) scanf("%d%d",&a,&b) #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c) #define pd(a) printf("%d ",a) #define scl(a) scanf("%lld",&a) #define scll(a,b) scanf("%lld%lld",&a,&b) #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c) #define IOS ios::sync_with_stdio(false);cin.tie(0) using namespace std; typedef long long ll; template <class T> void test(T a){cout<<a<<endl;} template <class T,class T2> void test(T a,T2 b){cout<<a<<" "<<b<<endl;} template <class T,class T2,class T3> void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;} const int N = 1e6+10; //const int MAXN = 210; const int inf = 0x3f3f3f3f; const ll INF = 0x3f3f3f3f3f3f3f3fll; const ll mod = 1000000007; int T; void testcase(){ printf("Case #%d: ",++T); } const int MAXN = 2500; const int MAXM = 30; char ma[MAXN]; int in[MAXN]; int head[MAXN], cnt; int n, k; struct node { int u, v, next; }; node edge[MAXN * MAXN]; void init(){ cnt = 0; memset(head, -1, sizeof(head)); memset(in, 0, sizeof(in)); } void add(int u, int v){ edge[cnt] = {u, v, head[u]}; head[u] = cnt++; } void topu(){ testcase(); queue<int> q; int ans=0; for(int i=0;i<n;++i){ if(!in[i]){ q.push(i); ans++; } } while(!q.empty()){ int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; in[v]--; if(!in[v]){ q.push(v); ans++; } } } if(n==ans) printf("No "); else printf("Yes "); } int main (){ #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL int t; scanf("%d", &t); T = 0; while(t--){ init(); scanf("%d ", &n); for(int i = 0; i < n; ++i){ gets(ma); for(int j = 0; j < n; ++j) if(ma[j] == '1'){ add(i, j); in[j]++; } } topu(); } return 0; }