题目链接:FFF at Valentine
题目大意
一张有向图, 对于任意两个节点u, v, 是否都满足存在u->v或者v->u的路径
思路
DFS暴力, 对于每个节点s进行DFS, 记录能从s到达的所有节点
最后n方检查每对节点u, v是否至少存在u->v或v->u中的一个
复杂度
O(T∗n∗n)
代码
858MS 7680K G++
#include <bits/stdc++.h>
using namespace std;
const int maxv = 1e3+100;
int n, m;
vector<int> G[maxv];
bool vist[maxv], mp[maxv][maxv];
void dfs(int s, int u)//s表示起点, u表示当前走道的节点
{
vist[u] = 1;
for(int i=0; i<(int)G[u].size(); ++i)
{
int v = G[u][i];
if(vist[v] == 0)
{
mp[s][v] = 1;
dfs(s, v);
}
}
}
int main()
{
int T, u, v;
for(scanf("%d", &T); T; --T)
{
scanf("%d%d", &n, &m);
for(int i=1; i<=n; ++i) G[i].clear();
for(int i=0; i<m; ++i)
{
scanf("%d%d", &u, &v);
G[u].push_back(v);
}
memset(mp, 0, sizeof(mp));
for(int i=1; i<=n; ++i)
{
memset(vist, 0, sizeof(bool)*(n+10));
dfs(i, i);
}
bool flag = 1;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=n; ++j)
{
if(i!=j)
{
if(mp[i][j] == 0 && mp[j][i] == 0)
{
flag = 0;
break;
}
}
}
if(flag == 0) break;
}
if(flag) puts("I love you my love and our love save us!");
else puts("Light my fire!");
}
return 0;
}