第一遍刷PAT
我的憨憨程序
(其实抄的标程)
思路:统计连通分量的个数
用到的知识是离散数学中的图论,不知道的同学得去补一补知识哦,这个不难的
#include<stdio.h>
#include<string.h>
int map[1010][1010];
int visit[1010];
int N;
void dfs(int node)//构建连通分量
{
visit[node]=1;
for(int i=1;i<=N;i++)
{
if(map[node][i]==1&&visit[i]==0)//如果存在去城市i的路线并且i没被访问过
dfs(i);//将i纳入该连通分量
}
}
int main()
{
int M,K,a,b;
scanf("%d%d%d",&N,&M,&K);
for(int i=0;i<M;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=1;
}
for(int i=0;i<K;i++)
{
memset(visit,0,sizeof(visit));//每一次check都是独立的
scanf("%d",&a);
visit[a]=1;//被check的城市将标志位置1,表示不能将其纳入任何一个连通分量
int cnt=0;//记录连通分量的个数
for(int j=1;j<=N;j++)//这里要注意我们设置的是visit[a]而不是visit[a-1]
{
if(visit[j]==0)//没有被访问过的一定不在已经构建好的连通分量里
{
dfs(j);//以j为根节点构建连通分量(连通分量也可以称作树)
cnt++;//连通分量的数量+1
}
}
printf("%d\n",cnt-1);//联通cnt个连通分量只需要cnt-1条线
}
return 0;
}
跟标程学了一个fill(map,map+1010,0)函数,可以代替这里的memset,在头文件 algorithm 中