爆刷PAT(甲级)——之【1013】 Battle Over Cities (25)——简单图论dfs搜索

题意:给N个点M个边,再给K个点的编号,输出每个点Ki是割点的时候,强联通块个数-1的值

难点:不知道为什么,一直超时了。。。。

     输入数据这么小。。。我大胆的假设,结局万万没想到,输入不能用  cin/cout  要用 格式化输入scanf ,否则就会超时!!!

Code:   虽然思路都差不多,写法也一样,但我觉得还是不够精炼,向柳巨巨学习。他们都是直接把割点搜索之前设置为  book[u]=true ,不存在我这种麻烦的 ban 变量的emmmm  ... ╥﹏╥

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define inf 1009
#define INF 0x3f3f3f3f
#define loop(x,y,z) for(x=y;x<z;x++)

int n,m,k;
int e[inf][inf];//存放地图
int book[inf];//标记
int ban;//断掉的城市(被ban掉的城市)

void dfs(int v)//搜索,起点为v
{
    book[v]=1;
    int i;
    loop(i,1,n+1)
        if(i!=ban&&!book[i]&&e[v][i])//如果有路且目标点不是ban点
            dfs(i);
}

void Input()
{
    scanf("%d%d%d",&n,&m,&k);
    int i,j;
    loop(i,0,m)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        e[a][b]=e[b][a]=1;//连通
    }
    int sum;//有几个连通块
    loop(i,0,k)
    {
        int v;
        cin>>v;
        memset(book,0,sizeof book);
        ban=v;//将此点ban掉
        sum=0;
        loop(j,1,n+1)
            if(j!=ban&&!book[j])//对各点开始搜连通块,ban点就不用搜了
            {
                sum++;//printf("--- %d\n",j);
                dfs(j);
            }
        printf("%d\n",sum-1);//修路等于连通数-1
    }
}

int main()
{
    Input();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值