zoukankan      html  css  js  c++  java
  • Codeforces 117C. Cycle 寻找环

    C. Cycle
    time limit per test
    2.5 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    tournament is a directed graph without self-loops in which every pair of vertexes is connected by exactly one directed edge. That is, for any two vertexes u and v (u ≠ v) exists either an edge going from u to v, or an edge from v to u.

    You are given a tournament consisting of n vertexes. Your task is to find there a cycle of length three.

    Input

    The first line contains an integer n (1 ≤ n ≤ 5000). Next n lines contain the adjacency matrix A of the graph (without spaces). Ai, j = 1 if the graph has an edge going from vertex i to vertex j, otherwise Ai, j = 0Ai, j stands for the j-th character in the i-th line.

    It is guaranteed that the given graph is a tournament, that is, Ai, i = 0, Ai, j ≠ Aj, i (1 ≤ i, j ≤ n, i ≠ j).

    Output

    Print three distinct vertexes of the graph a1a2a3 (1 ≤ ai ≤ n), such that Aa1, a2 = Aa2, a3 = Aa3, a1 = 1, or "-1", if a cycle whose length equals three does not exist.

    If there are several solutions, print any of them.

    Sample test(s)
    input
    5
    00100
    10000
    01001
    11101
    11000
    
    output
    1 3 2 
    input
    5
    01111
    00000
    01000
    01100
    01110
    
    output
    -1
    

    找到并输出一条长度为3的环。

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    bool v[5555]={0};
    int n;
    char s[5555][5555];
    bool dfs(int i,int dad)
    {
        v[i]=true;
        for (int j=1;j<=n;j++)
        {
            if (s[i][j]-'0')
            {
                if (s[j][dad]-'0')
                {
                    printf("%d %d %d\n",dad,i,j);
                    return true;
                }
                if (!v[j])
                {
                    if (dfs(j,i)) return true;
                }
            }
        }
        return false;
    }
    
    int main()
    {
        cin>>n;
    
        for (int i=1;i<=n;i++)
        {
            scanf("%s",s[i]+1);
        }
    
        for (int i=1;i<=n;i++)
        {
            if (!v[i])
            {
                if (dfs(i,i)) return 0;
            }
        }
        printf("-1\n");
        return 0;
    }
    

  • 相关阅读:
    向MySql中插入中文时出现乱码
    MySql插入记录时判断
    SuperGridControl 使用小技巧
    Winform开发中常见界面的DevExpress处理操作
    mysql优化之索引建立的规则
    App性能优化浅谈
    AndroidManifest具体解释之Application(有图更好懂)
    算法——递归思想解决排列组合问题
    Windows App开发之集合控件与数据绑定
    table行随鼠标变色
  • 原文地址:https://www.cnblogs.com/cyendra/p/3038463.html
Copyright © 2011-2022 走看看