CF117C Cycle 题解
给出一种非常简洁的做法。
考虑对于一个点
那么
假设
所以我们可以直接把
这样的话把若干条边忽略后,每一个点最多只有一条出边。那么我们只需要枚举两个点
时间复杂度
#include <bits/stdc++.h>
using namespace std;
const int N=5010;
int n,to[N];
char a[N][N];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%s",a[i]+1);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (a[i][j]==49 && (!to[i] || a[j][to[i]]==49)) to[i]=j;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (a[to[i]][j]==49 && a[j][i]==49)
return printf("%d %d %d\n",i,to[i],j),0;
printf("-1");
return 0;
}