//
// main.cpp
// PAT_1013. Battle Over Cities
//
// Created by wjq on 17/4/2.
// Copyright © 2017年 wjq. All rights reserved.
//
/*用邻接矩阵做的dfs
#include <iostream>
#include <string.h>
using namespace std;
int G[1005][1005];
bool vis[1005];
int numOfCities,numOfRoads,numOfConcerns;
void dfs(int i,int concern)
{
for(int j=1;j<=numOfCities;j++)
{
//要搜的节点j与当前节点i存在路.且要搜的点没被搜过
if(G[i][j]==1&&i!=concern&&j!=concern&&vis[j]==false)
{
//cout<<"当前节点为"<<i<<",即将访问"<<j<<endl;
vis[j]=true; //把要搜的点设置为搜过.
dfs(j,concern);
}
}
}
void init()
{
memset(vis,false,sizeof(vis));
for(int i=0;i<1005;i++)
for(int j=0;j<1005;j++)
G[i][j]=-1;
}
int findNum(int concern)
{
int num=0;
for(int i=1;i<=numOfCities;i++)
{
if(vis[i]==false&&i!=concern)
{
dfs(i,concern);
num++;
}
}
return num-1;
}
void output()
{
for(int i=1;i<=numOfCities;i++)
{
for (int j=1;j<=numOfCities;j++)
cout<<G[i][j];
cout<<endl;
}
}
int main(int argc, const char * argv[])
{
int A,B;
init();
cin>>numOfCities>>numOfRoads>>numOfConcerns;
for(int i=0;i<numOfRoads;i++)
{
cin>>A>>B;
G[A][B]=G[B][A]=1;
}
for(int i=0;i<numOfConcerns;i++)
{
cin>>A;
cout<<findNum(A)<<endl;
memset(vis,false,sizeof(vis));
}
}
*/
#include <iostream>
#include <string.h>
using namespacestd;
int numOfCities,numOfRoads,numOfConcerns;
int father[1005],size[1005];
struct Node
{
int from,to;
}node[1000000];
int Find(int i)
{
int r=i;
while(father[r]!=r)
r=father[r];
int x=i,temp;
while(x!=r)
{
temp=father[x];
father[x]=r;
x=temp;
}
return r;
}
void Union(int x,int y)
{
int fx=Find(x),fy=Find(y);
if(fx!=fy)
{
if(size[fx]<=size[fy])
{
father[fx]=fy;
size[fy]+=size[fx];
}
else
{
father[fy]=fx;
size[fx]+=size[fy];
}
}
}
void BuildFather(int x)
{
for(int i=0;i<1005;i++)
{
father[i]=i;
size[i]=1;
}
for(int i=0;i<numOfRoads;i++)
{
if(node[i].from!=x&&node[i].to!=x)
Union(node[i].from,node[i].to);
}
}
int main()
{
int destroy_city,result;
scanf("%d%d%d",&numOfCities,&numOfRoads,&numOfConcerns);
for(int i=0;i<numOfRoads;i++)
scanf("%d%d",&node[i].from,&node[i].to);
for(int i=0;i<numOfConcerns;i++)
{
scanf("%d",&destroy_city);
BuildFather(destroy_city);
result=0;
for(int j=1;j<=numOfCities;j++)
{
if(father[j]==j&&j!=destroy_city)
result++;
}
cout<<result-1<<endl;
}
}
/* 用vector邻接表的dfs
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
vector<int> G[1005];
bool vis[1005];
int numOfCities,numOfRoads,numOfConcerns;
void dfs(int i,int concern)
{
//if(vis[i]==true)
// return;
for(int j=0;j<G[i].size();j++)
{
if(i==concern||G[i][j]==concern||vis[G[i][j]]==true)
continue;
vis[G[i][j]]=true;
cout<<"节点"<<i<<"已访问,继续访问节点"<<G[i][j]<<endl;
dfs(G[i][j],concern);
}
}
void init()
{
memset(vis,false,sizeof(vis));
}
int findNum(int concern)
{
int num=0;
for(int i=1;i<=numOfCities;i++)
{
if(vis[i]==false&&i!=concern)
{
dfs(i,concern);
num++;
}
}
return num-1;
}
int main(int argc, const char * argv[])
{
int A,B;
init();
cin>>numOfCities>>numOfRoads>>numOfConcerns;
for(int i=0;i<numOfRoads;i++)
{
cin>>A>>B;
G[A].push_back(B);
G[B].push_back(A);
}
for(int i=0;i<numOfConcerns;i++)
{
cin>>A;
cout<<findNum(A)<<endl;
init();
}
}
*/
写这题用了三种方法,,都过了,一开始用dfs也是300多ms,然后用并查集也是300多ms,,后来把cin改成scanf,并查集的瞬间降到60ms...果然pat上还是要用scanf来读取数据吗0.0