题意:一个有向图,问任意两点间是否存在一条路可到达另一个点(A->B 或 B->A 有一条路即可)
思路:官方题解,缩点为DAG,则如果有两个及以上出度为0的点则有不能走到同一个点的点对,真是巧妙
暴力可破,从每个点开始bfs,发现一对新的关系,就记录下,最后关系有n*(n-1) / 2的话,满足题意
#include<bits/stdc++.h>
using namespace std;
vector<int> v[1005];
int line[1005][1005],vis[1005];
int ans;
void bfs(int st)
{
queue<int> q;
while(!q.empty())
q.pop();
q.push(st);
memset(vis,0,sizeof vis);
vis[st] = 1;
while(!q.empty())
{
int x = q.front();q.pop();
for(int i = 0; i < v[x].size(); i++)
{
int y = v[x][i];
if(vis[y] == 0)
{
vis[y] = 1;
q.push(y);
if(line[st][y] == 0)
{
line[st][y] = line[y][st] = 1;
ans++;
}
}
}
}
}
int main()
{
int T,n,m;cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
v[i].clear();
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
}
memset(line,0,sizeof line);
ans = 0;
for(int i = 1; i <= n; i++)
bfs(i);
if(ans == n*(n-1)/2)
printf("I love you my love and our love save us!\n");
else
printf("Light my fire!\n");
}
return 0;
}