畅通工程数据结构

  • 格式:doc
  • 大小:20.50 KB
  • 文档页数:4

畅通工程

描述:

某省调查乡村交通状况,得到现有村庄公路统计表,表中列出了每条公路直接连通的村庄。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。问最少还需要建设多少条公路?

输入说明:

包含多组测试用例。每个测试用例的第1行给出两个正整数,分别是村庄数目N(<1000)和公路数目M。随后的M行对应M条公路,每行给出一对正整数,分别是该条公路直接连通的两个村庄的编号。为简单起见,村庄从1到N编号。当N为0时,输入结束,该用例不被处理。

输出说明:

对每个测试用例,在一行上输出最少还需要建设多少条公路。

输入样例:

4 2

1 3

4 3

3 2

1 2

2 3

9 8

1 2

1 3

2 4

3 4

5 7

5 6

6 7

8 9

999 0

0

输出样例:

1

0

2

998

实现提示:

该问题实质为求连通分量的个数减一,可用深度优先或广度优先搜索求解,也可用MFSet求解。

#include

#include

typedef struct edge{

int from;

int to;

struct edge * next_edge;

}Edge;

typedef struct node{

int name;

Edge *first_edge;

}Node;

typedef struct gragh{

int node_num;

int edge_num;

Node country[1024];

}Gragh;

void creat_graph(Gragh &G);

int tree_DFS(Gragh &G);

void DFS(int visited[1024],Gragh &G,int v);

int record_sequence[1024];

int record_count =0;

int main(){

Gragh country_road;

while(1)

{

creat_graph(country_road);

printf("%d\n",tree_DFS(country_road));

}

return 0;

}

void creat_graph(Gragh &G)

{

int v1 =0;

int v2 =0;

int i =0;

Edge *new_edge;

printf("input:\n"); scanf("%d",&G.node_num);

if(!G.node_num)

{

for(i=0;i

{

printf("%d\n",record_sequence[i]);

}

exit(0);

}

scanf("%d",&G.edge_num);

for(i=0;i

{

G.country[i].first_edge=NULL;

}

for(i=0;i

{

scanf("%d %d",&v1,&v2);

new_edge=(Edge *)malloc(sizeof(Edge));

new_edge->from=v1;

new_edge->to=v2;

if(!G.country[v1].first_edge)

{

new_edge->next_edge=NULL;

G.country[v1].first_edge=new_edge;

}

else

{

new_edge->next_edge=G.country[v1].first_edge->next_edge;

G.country[v1].first_edge->next_edge=new_edge;

}

new_edge=(Edge *)malloc(sizeof(Edge));

new_edge->from=v2;

new_edge->to=v1;

if(!G.country[v2].first_edge){

new_edge->next_edge=NULL;

G.country[v2].first_edge=new_edge;

}

else{

new_edge->next_edge=G.country[v2].first_edge->next_edge;

G.country[v2].first_edge->next_edge=new_edge;

}

}

}

int tree_DFS(Gragh &G) {

int count=0;

int visited[1024];

int i=0;

for(i=0;i<1024;i++)

visited[i]=0;

for(i=1;i<=G.node_num;i++)

{

if(!visited[i]){

count++;

DFS(visited,G,i);

}

}

record_sequence[record_count++]=count-1;

return count-1;

}

void DFS(int visited[1024],Gragh &G,int v)

{

Edge *cur_edge;

visited[v]=1;

for(cur_edge=G.country[v].first_edge;cur_edge;cur_edge=cur_edge->next_edge)

DFS(visited,G,cur_edge->to);

}