图的遍历 | 1013 连通块块数
dfs解法:
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 1010 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; int n,m,k; vector<int> g[LEN]; int vis[LEN]; int bk; void dfs(int s){ int size=g[s].size(); int i; vis[s]=1; for(i=0;i<size;i++){ int o=g[s][i]; if(vis[o]==0 && o!=bk) dfs(o); } } int main(){ // freopen("1016.txt","r",stdin); int a,b,i,j; I("%d%d%d",&n,&m,&k); FF(i,m){ I("%d%d",&a,&b); g[a].push_back(b); g[b].push_back(a); } FF(i,k){ I("%d",&bk); memset(vis,0,sizeof vis) ; int ans=0; for(j=1;j<=n;j++){ if(j!=bk && vis[j]==0){ dfs(j); ans++; } } printf("%d\n",ans-1) ; } return 0; }