思路
找长度为3的环。深度搜索(并传入当前点与上个点的参数),每个走过的位置都打上标记,返回时不用取消,因为必定不可能从该点得到答案了。
实现
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5010;
int n;
char graph[maxn][maxn];
bool vis[maxn];
bool dfs(int now,int be){
vis[now] = 1;
for(int i=1;i<=n;i++){
if (graph[now][i]-'0'){
if (graph[i][be]-'0'){
cout<<be<<" "<<now<<" "<<i<<endl;
return true;
}
if (!vis[i])
if (dfs(i,now)) return true;
}
}
return false;
}
void solve(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%s",graph[i]+1);
for(int i=1;i<=n;i++)
if (!vis[i]){if (dfs(i,i)) return;}
puts("-1");
}
int main(){
solve();
}
感悟
这道题的要求环长度少只有3,因此可以用传参的方式快速判断是否达成条件。否则用vector<int>数组push_back,pop_back来进行答案的存储与判断。