1. 程式人生 > >HDU - 4324 Triangle LOVE(拓撲排序)

HDU - 4324 Triangle LOVE(拓撲排序)

斷圖 如何判斷 targe con ack algorithm scanf 否則 rst

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\n",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\n"); else printf("Yes\n"); } 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; }

HDU - 4324 Triangle LOVE(拓撲排序)