2019_GDUT_新生专题 图论 C

题目:六度分离

题目链接:https://vjudge.net/contest/351234#problem/C

题目描述:给出图,判断任意两点能不能七步之内互通。

题目分析:由于是七步之内,所以用DFS就能解决,找关系的文题然后就要检查看各点的跑点情况。

代码:

#include <stdio.h>
#include <stdlib.h>
int n,m,b[102],d[102],c[102];
struct Way
{
    int begin;
    int end;
}a[500];
int clean(int *x,int y,int z)  //用来初始化
{
    int i;
    for(i=0;i<y;i++)
        x[i]=z;
    return 0;
}
int comp(const void *p1,const void *p2)
{
    return (*(struct Way*)p2).begin>(*(struct Way*)p1).begin?-1:1;
}
int dfs(int x,int y)  //搜索用
{
    if(c[x]) return 0;  //搜索过点不要
    c[x]=1;//标记已走
    int i;
    for(i=d[x];i<2*m;i++)
    {
        if(a[i].begin!=x) break;
        if(y<b[a[i].end]) b[a[i].end]=y;
        if(y<7) dfs(a[i].end,y+1);//深度7
    }
    c[x]=0;//解除标记
    return 0;
}
int cheak(int x)//检查各点可跑情况
{
    int i;
    b[x]=0;
    c[x]=1;
    for(i=d[x];i<2*m;i++)
    {
        if(a[i].begin!=x) break;
        b[a[i].end]=1;
        dfs(a[i].end,2);
    }
     for(i=0;i<n;i++)
     {
         if(b[i]>7) break;
     }
     if(i==n) return 0;
     else return 1;
}
int main()
{
    int i,p;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<2*m;i+=2)
    {
        scanf("%d%d",&a[i].begin,&a[i].end);
        a[i+1].begin=a[i].end;
        a[i+1].end=a[i].begin;
    }
     qsort(a,2*m,sizeof(a[0]),comp);
     for(i=2*m-1;i>=0;i--)
     {
         d[a[i].begin]=i;
     }
     for(i=0,p=0;i<n;i++)
     {  clean(b,n,1000);
        clean(c,n,0);
        if(cheak(i)) {p=1;break;}
     }
     if(p) printf("No\n");
     else printf("Yes\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值