1 /*
2 Author: Leo.W
3 Descriptipn: 给定几个顶点以及已知某几个顶点存在通路,求最少还需几条路即可完成连通图
4 How to Do: 由最后一组测试数据易知999 0,且结合最小生成树的知识可得,连通分量数减一即得解
5 */
6 #include <iostream>
7 #include <stdio.h>
8 #include <string.h>
9 using namespace std;
10 #define MAXSIZE 1000
11 int path[MAXSIZE][MAXSIZE];
12 bool appear[MAXSIZE];
13 bool chose[MAXSIZE];
14 int m,n,lt;//图中连线后的连通分量数
15
16 void bfs(int num){
17 chose[num]=true;
18 int i;
19 for(i=1;i<=m;i++)
20 if(i!=num&&path[num][i]==0&&!chose[i]){//点i与点num有连线,并且点i还未被选入集合
21 lt--; bfs(i);
22 }
23 }
24 int main(){
25 //freopen("in.txt","r",stdin);
26 while(scanf("%d",&m),m){//城镇数
27 scanf("%d",&n);//已有的公路条数
28 lt=m;
29 memset(appear,false,MAXSIZE);
30 memset(chose,false,MAXSIZE);
31 int i,j;
32 for(i=1;i<=m;i++){
33 for(j=1;j<=m;j++)
34 path[i][j]=MAXSIZE;
35 }
36 for(i=0;i<n;i++){
37 int begin,end;
38 scanf("%d%d",&begin,&end);
39 appear[begin]=appear[end]=true;//表示已经连上线的点,即已经出现
40 path[begin][end]=path[end][begin]=0;
41 }
42 for(i=1;i<=m;i++)
43 if(appear[i]&&!chose[i]){
44 bfs(i);
45 }
46 printf("%d\n",lt-1);
47 }
48 return 0;
49 }
posted on 2012-03-06 13:38
Leo.W 阅读(122)
评论(0) 编辑 收藏 引用