一个判断是否有3个成环的题目dfs或者bfs,修改他的depth或vis值判断其是否为+2关系判断
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
vector<int>vec[10000];
int vis[10000];
int flag;
void dfs(int u,int len)
{
vis[u]=len;
for(int i=0; i<vec[u].size(); i++)
{
if(vis[vec[u][i]]==0)
dfs(vec[u][i],len+1);
else if(vis[vec[u][i]]==len-2)
{flag=1;}
else continue;
if(flag)return;
}
}
int main()
{
int t;
cin>>t;
for(int k=1; k<=t; k++)
{
char s[10000];
flag=0;
int n;
cin>>n;
for(int i=0; i<n; i++)
{
vis[i]=0;
vec[i].clear();
scanf("%s",s);
for(int j=0; j<n; j++)
{
if((s[j]-'0')>=1)
vec[i].push_back(j);
}
}
/* for(int i=0;i<n;i++)
{
for(int j=0;j<vec[i].size();j++)
{
cout<<vec[i][j]<<" ";
}
cout<<endl;
}*/
for(int j=0; j<n; j++)
{
if(!vis[j])dfs(j,1);
if(flag)break;
}
if(flag)cout<<"Case "<<"#"<<k<<": "<<"Yes"<<endl;
else cout<<"Case "<<"#"<<k<<": "<<"No"<<endl;
}
return 0;
}
还有一种方法运用了容斥定理,用拓扑排序判断是否有环存在,从而判断是否有三个人三角恋关系
#include<stdio.h>
#include<string.h>
#define M 2100
char mp[M][M];
int du[M];
int n,cas;
void topo(){
int ok=0,i,k;
for(int i=1;i<=n;i++){
for(k=1;k<=n;k++)
if(du[k]==0) //z找到入度为0的点
break;
if(k==n+1){//如果不存在入度为0的点,那么就是一定存在环 ,就有三角恋
ok=1;
break;
}else{
du[k]--;//删除这个点
for(int j=1;j<=n;j++){
if(mp[k][j]=='1'&&du[j]!=0)
du[j]--;
}
}
}
if(ok) printf("Case #%d: Yes\n",cas++);
else printf("Case #%d: No\n",cas++);
}
int main(){
int i,j,t;
cas=1;
scanf("%d",&t);
while(t--){
memset(du,0,sizeof(du));
scanf("%d",&n);
for(i=1;i<=n;i++){//按照注释的输入会超时
//getchar();
scanf("%s",mp[i]+1);;
for(j=1;j<=n;j++){
// scanf("%c",&mp[i][j]);
if(mp[i][j]=='1')
du[j]++;
}
}
topo();
}
return 0;
}
特别注意要输入不用scanf(%c)超时,要用%s,时间上的区别