问题描述
蒜头君来到一个由 n个小岛组成的世界,岛与岛之间通过修建桥,来让岛上的居民可以去其他的小岛。已知已经修建了 m 座桥,居民们想让蒜头君帮忙计算,最少还要在修建几座桥,居民们才能去所有的岛
输入描述
第一行输入俩个数字 n,m,分别代表岛的个数,和已经修建的桥的个数,岛的编号分别是 1…n。( 1≤n≤1000,0≤m≤n×(n−1)/2)接下来的 m 行,每行俩个数字,代表这俩个编号的岛之间已经有一座桥了。
输出格式
输出一个整数,表示最少还需要修建多少座桥,居民才能去所有的岛
样例输入
5 4
1 2
2 3
4 5
1 3
样例输出
1
小小的思路
最小的修桥数应该是n-1,利用深搜DFS正好可以找到从一个点到另一点不重复路径,记录这些桥为q。
所以最后输出 (n-1)-q就行了。
代码
#include <iostream>
#include <string.h>
using namespace std;
const int maxn = 1001;
const int maxm = 10000;
struct edge{
int v,pre;
}e[maxm];
int p[maxn],eid,q = 0;
void init(){
memset(p,-1,sizeof(p));
eid = 0;
}
void insert(int u,int v){
e[eid].v = v;
e[eid].pre = p[u];
p[u] = eid++;
}
bool vst[maxn];
void dfs(int u){
vst[u] = true;
for(int i = p[u];i!=-1;i = e[i].pre){
if(!vst[e[i].v]){
dfs(e[i].v);
q++;
}
}
}
int main(){
init();
memset(vst,false, sizeof(vst));
int n,m;
cin>>n>>m;
int u1,v1;
for(int j = 0;j<m;j++){
cin>>u1>>v1;
insert(u1,v1);
insert(v1,u1);
}
for(int i = 1;i<=n;i++){
dfs(i);
}
cout<<n-1-q;
return 0;
}