• HDU


    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;
    }
  • 相关阅读:
    二分匹配最大匹配的理解(附图解)
    poj2060Taxi Cab Scheme(二分图匹配)
    codeforce Pashmak and Buses(dfs枚举)
    UVAoj 348
    poj2253 Frogger(最短路变型或者最小生成树)
    ZZUOJ1196: 单调数
    hdu3339 In Action(Dijkstra+01背包)
    ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)
    hdu 1241 Oil Deposits (一次dfs搞定有某有)
    POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)
  • 原文地址:https://www.cnblogs.com/fht-litost/p/9281552.html
Copyright © 2020-2023  润新知