HDU-6165-FFF at Valentine

Link

Unkown:

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 1e3+7;
int n,m;
vector<int> e[maxn];
vector<int> g[maxn];

int low[maxn],dfn[maxn],ind,ins[maxn],scc,contract[maxn],top;
int d[maxn];
int stk[maxn];
int vis[maxn];

void ini(){
    for(int i = 0;i<maxn;i++){
        d[i] = low[i] = dfn[i] = 0;
        contract[i] = i;
        e[i].clear();
        g[i].clear();
        vis[i] = 0;
    }
    top = scc = 0;
    ind = 0;
}

int tarjan(int u)  {  
    int v;  
    low[u] = dfn[u] = ++ind;  
    stk[top++] = u;  
    ins[u] = true;  
    for(int i = 0;i<e[u].size();i++) {  
        v = e[u][i];
        if(!dfn[v]) {  
            tarjan(v);  
            if(low[u] > low[v])  
                low[u] = low[v];  
        }  
        else if(ins[v] && low[u] > dfn[v])  
            low[u] = dfn[v];  
    }  

    if(low[u] == dfn[u])  {  
        scc++;  
        do {  
            v = stk[--top];  
            contract[v] = scc;  
            ins[v] = false;  
        }  
        while( v!= u );  
    }  
}  

int dfs(int n,int dep){
    for(int i = 0;i<g[n].size();i++){
        int to = g[n][i];
        if(vis[to] == 0) return dfs(to,dep+1);
    }
    return dep;
}
int main() {
    int t;cin >> t;
    while(t--){
        ini();
        cin >> n >> m;
        for(int i = 0;i<m;i++){
            int u,v;
            cin >> u >> v;
            e[u].push_back(v);
        }
        for(int i = 1;i<=n;i++){
            if(dfn[i] == 0) tarjan(i);
        }
        for(int i = 1;i<=n;i++){
            for(int j = 0;j<e[i].size();j++){
                int to = e[i][j];
                if(contract[to] != contract[i]){
                    g[contract[i]].push_back(contract[to]);
                    d[contract[to]]++;
                }
            }
        }
        int pos = 0,cnt= 0;
        for(int i = 1;i<=scc;i++){
            if(d[i] == 0){
                pos = i;
                cnt++;
            }
        }
        int maxdp =0;
        if(cnt == 1){
            maxdp = max(maxdp,dfs(pos,1));
        }
        if(maxdp == scc && cnt == 1){
            cout << "I love you my love and our love save us!" << endl;
        }else{ 
            cout << "Light my fire!" << endl;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lanadeus/article/details/78145929
fff