畅通工程数据结构
- 格式: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); }