dfs1 hdu 4324

一个判断是否有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,时间上的区别

猜你喜欢

转载自blog.csdn.net/qq_42193011/article/details/80963430