HDU-2017 多校训练赛9-1005-FFF at Valentine

来源:互联网 发布:php 取数组最大值 编辑:程序博客网 时间:2024/06/11 14:59

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