HDU - 4324 Triangle LOVE(拓扑排序)

Posted fht-litost

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 4324 Triangle LOVE(拓扑排序)相关的知识,希望对你有一定的参考价值。

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;
}

 

以上是关于HDU - 4324 Triangle LOVE(拓扑排序)的主要内容,如果未能解决你的问题,请参考以下文章

HDU4324 Triangle LOVE拓扑排序

hdu 4324 Triangle LOVE(拓扑判环)

hdu 4324 Triangle LOVE 拓扑排序

HDU - 4324 Triangle LOVE(拓扑排序)

L - Love Triangle

HDU 4466 Triangle