PAT甲级1013
Battle Over City
整体思路
- 用vector定义邻接表
- 用queue来写BFS遍历
- 从1-N个点依次访问邻接表。如果已经访问过第i个点那么直接访问下一个邻接表头;如果未访问过,那么从这个点开始进行广度优先遍历,访问过的所有点记为已访问。在从1-N访问邻接表过程中,遇到未访问的点,那么连通分量个数加一。最后需要修路的个数是连通分量个数-1。还可以用并查集做,但是第一个想到的是BFS,输入输出用cin和cout会超时,改为scanf和printf是可以的。对vector进行赋值的时候不是i=0;i<
代码块
#include<cstdio>
#include<vector>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
int main(){
int N,M,K;
cin >> N >> M >>K;
vector <int> Adj[N],Adj1[N];
queue <int> q;
int visit[N];int b[K];
int i,j,k,u,v;
for(i=0;i<M;i++){
scanf("%d%d",&u,&v);
u--;
v--;
Adj[u].push_back(v);
Adj1[u].push_back(v);
Adj[v].push_back(u);
Adj1[v].push_back(u);
}
for(i=0;i<K;i++){
scanf("%d",&b[i]);
b[i]--;
}
fill(visit,visit+N,0);int cnt[K];
fill(cnt,cnt+K,0);
for(i=0;i<K;i++){
fill(visit,visit+N,0);
visit[b[i]] = -1;
Adj[b[i]].clear();
for(j=0;j<N;j++){
if(visit[j]!=0) continue;
if(Adj[j].size() == 0 ) {
cnt[i]++;
visit[j] = 1;
}
else{
cnt[i] ++;
vector <int> :: iterator it = Adj[j].begin();
q.push(j);
while(!q.empty()){
int p = q.front();
q.pop();
vector <int> :: iterator it2 = Adj[p].begin();
for(k=0;k<Adj[p].size();k++){
if(visit[*(it2 + k)]==0){
q.push(*(it2 + k));
visit[*(it2 + k)] = -1;
}
}
}
}
}
vector <int> :: iterator it1 ;
it1 = Adj1[b[i]].begin();
for(k=0;k<Adj1[b[i]].size();k++){
Adj[b[i]].push_back(*(it1+k));
}
vector <int> :: iterator it = Adj[b[i]].begin();
//for(k=0;k<Adj[b[i]].size()-1;k++)
// cout << " " << (*(it+k));
}
for(i=0;i<K;i++){
printf("%d\n",cnt[i]-1);
}
return 0;
}