HDU 6165 FFF at Valentine

来源:互联网 发布:跨运营商之间网络不通 编辑:程序博客网 时间:2024/06/06 04:29

题目地址
题意:给你一个图,问是不是任意两个点都能至少从其中一个到另一个
思路:因为时间复杂度可以为n^2,所以可以用dfs去搜索每个点,所以暴力就好了。但是我的想法和题解是一样的,就是把图缩点为一个DAG,则如果在拓扑序中出现了有两个及以上入度为0的点则不合法,但是有队友暴力写出来了就没有写了。

#include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#include <iomanip>#define N 1010#define LL __int64#define inf 0x3f3f3f3f#define lson l,mid,ans<<1#define rson mid+1,r,ans<<1|1#define getMid (l+r)>>1#define movel ans<<1#define mover ans<<1|1using namespace std;const LL mod = 1000000007;int n, m;bool flag[N][N];int cnt;vector<int> mapp[N];bool vis[N];void dfs(int u) {    for (int i = 0; i < mapp[u].size(); i++) {        int v = mapp[u][i];        if (!vis[v]) {            flag[cnt][v] = true;            flag[v][cnt] = true;            vis[v] = true;            dfs(v);        }    }}void solve(int u) {    memset(vis, false, sizeof(vis));    vis[u] = true;    cnt = u;    dfs(u);    flag[u][u] = 1;}void init() {    for (int i = 0; i <= n; i++) {        mapp[i].clear();    }    memset(flag, false, sizeof(flag));}int main() {    cin.sync_with_stdio(false);    int T;    int a, b;    cin >> T;    while (T--) {        cin >> n >> m;        init();        for (int i = 0; i < m; i++) {            cin >> a >> b;            mapp[a].push_back(b);        }        for (int i = 1; i <= n; i++) {            solve(i);        }        cnt = 0;        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= n; j++) {                if (flag[i][j] == false) {                    cnt = 1;                }            }        }        if (!cnt) {            cout << "I love you my love and our love save us!" << endl;        }        else {            cout << "Light my fire!" << endl;        }    }    return 0;}