~思路 并查集 ,攻占一个城市后有三种情况
1、连通分支数不变——攻占的是最外侧的点;
2、连通分支数变多——攻占的点是至少连着两个点;
3、连通分支数变少——攻占的点本身就是一个连通分支。
/*#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int pre[510];
int find(int n){
int r;
r=n;
while(pre[r]!=r){
r=pre[r];
}
return r;
}
int Union(int x,int y){
int xx;int yy;
xx=find(x);yy=find(y);
if(xx!=yy){
pre[xx]=yy;
}
}
int main() {
int n,m;
int a,b;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
pre[i]=i;
}
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
Union(a,b);
}
int k=0;
for(int i=0;i<n;i++){
if(pre[i]==i)
k++;
}
printf("%d\n",k);
return 0;
}