题意:给一个图,然后让图上的一个点消失,问剩下的联通块要几条边变成一个联通块
思路:dfs,求联通块
注意点:最后一个数据超时,优化一下
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int vis[1005];
vector<int> v[1005];
int sum;
void f_l(int x){
if(vis[x]==1){
for(int i=1;i<=n;i++){
if(vis[i]==0)
f_l(i);
}
}else{
vis[x]=1;
vector<int>::iterator it;
int f=0;
for(it=v[x].begin();it!=v[x].end();it++){
if(vis[*it]==0){
f_l(*it);
f=1;
}
}
if(f==0)
sum++;
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
while(k--){
int tmp;
cin>>tmp;
sum=0;
memset(vis,0,sizeof(vis));
vis[tmp]=1;
f_l(tmp);
cout<<sum-1<<endl;
}
return 0;
}
博客围绕一个图的问题展开,题目要求在图上让一个点消失,计算剩下联通块变成一个联通块所需边数。解题思路是使用dfs求联通块,但最后一个数据超时,需进行优化。
5329

被折叠的 条评论
为什么被折叠?



