ACM模版

描述

题解

两遍 dfs ,正着一遍,反着一遍,准确说不是两遍,而是每个位置都需要两遍,有些暴力的意味,但是还真的 AC 了。

代码

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN = 1111;

int n, m;
bool vis[MAXN][2];
vector<int> vs;
vector<int> vi[MAXN];
vector<int> rvi[MAXN];

void add_edge(int u, int v)
{
    vi[u].push_back(v);
    rvi[v].push_back(u);
}

void dfs_1(int x)
{
    vis[x][0] = true;
    for (int i = 0; i < vi[x].size(); i++)
    {
        if (!vis[vi[x][i]][0])
        {
            dfs_1(vi[x][i]);
        }
    }
}

void dfs_2(int x)
{
    vis[x][1] = true;
    for (int i = 0; i < rvi[x].size(); i++)
    {
        if (!vis[rvi[x][i]][1])
        {
            dfs_2(rvi[x][i]);
        }
    }
}

void init()
{
    vs.clear();
    for (int i = 0; i <= n; i++)
    {
        vi[i].clear();
        rvi[i].clear();
    }
}

int main()
{
    int T;
    scanf("%d",&T);

    while (T--)
    {
        init();

        scanf("%d%d", &n, &m);

        int u, v;
        for (int i = 0; i < m; i++)
        {
            scanf("%d%d", &u, &v);
            add_edge(u, v);
        }

        bool falg = false;
        for (int i = 1; i <= n; i++)
        {
            memset(vis, false, sizeof(vis));

            dfs_1(i);
            dfs_2(i);

            for (int i = 1; i <= n; i++)
            {
                if (!vis[i][0] && !vis[i][1])
                {
                    falg = true;
                    break;
                }
            }

            if (falg)
            {
                break;
            }
        }

        if (falg)
        {
            printf("Light my fire!\n");
        }
        else
        {
            printf("I love you my love and our love save us!\n");
        }
    }

    return 0;
}