//采用不同的图存储结构结构邻接矩阵、邻接表分别dfs,我想我是寂寞了吧,应该试试并查集,看见可以用并查集的就用dfs,bfs代替。。。。。。怕了并查集了
//邻接矩阵dfs
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1001;
int g[maxn][maxn];
int n,tmp;
bool vis[maxn];
void dfs(int v)
{
	vis[v]=true;
	for(int i=1;i<=n;i++)
	{
		if(!vis[i]&&g[v][i]>0)dfs(i);
	}
}
int dfstra()
{
	int i;
	fill(vis,vis+maxn,false);
	int cnt=0;
	for(i=1;i<=n;i++)
				if(g[tmp][i]>0)g[tmp][i]=g[i][tmp]=-1;
	for( i=1;i<=n;i++)
	{
		if(!vis[i]&&i!=tmp)
		{
			dfs(i);
			cnt++;
		}
	}
	for(i=1;i<=n;i++)
				if(g[tmp][i]<0)g[tmp][i]=g[i][tmp]=1;
	return cnt-1;
}
int main()
{
	freopen("input.txt","r",stdin);
	int i,j,m,k;
	while(scanf("%d%d%d",&n,&m,&k)!=EOF)
	{
		int a,b;
		fill(g[0],g[0]+maxn*maxn,0);
		for(i=0;i<m;i++)
		{
			scanf("%d%d",&a,&b);
			g[a][b]=g[b][a]=1;
		}
		for(i=0;i<k;i++)
		{
			scanf("%d",&tmp);
			printf("%d\n",dfstra());
		}
	}
	return 0;
}
//邻接表dfs
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1001;
vector<int >g[maxn];
bool vis[maxn];
int n,cur;
void dfs(int v)
{
	vis[v]=true;
	for(int i=0;i<g[v].size();i++)
	{
		int t=g[v][i];
		if(!vis[t]&&t!=cur)dfs(t);
	}
}
int dfstra()
{
	int i;
	fill(vis,vis+maxn,false);
	int cnt=0;
	for( i=1;i<=n;i++)
	{
		if(!vis[i]&&i!=cur)
		{
			dfs(i);
			cnt++;
		}
	}
	return cnt-1;
}
int main()
{
	freopen("input.txt","r",stdin);
	int i,j,m,k;
	while(scanf("%d%d%d",&n,&m,&k)!=EOF)
	{
		int a,b;
		for(i=0;i<m;i++)
		{
			scanf("%d%d",&a,&b);
			g[a].push_back(b);
			g[b].push_back(a);
		}
		for(i=0;i<k;i++)
		{
			scanf("%d",&cur);
			printf("%d\n",dfstra());
		}
	}
	return 0;
}
PAT1013. Battle Over Cities(邻接矩阵、邻接表分别dfs)
原文:http://www.cnblogs.com/zeroArn/p/5243991.html