题意:给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;
}