目录
简介
舟山岛屿众多,现要在 n 个岛屿之间修建桥梁,使得这 n 个岛屿之间任何两 个岛屿都能够互相来往(但不一定是直接建桥,可以是 A->B->C,即为 A 能够到 C)。现已知如下信息:
a. 岛屿个数;(这部分数据可以自己构造)
b. 岛屿之间已有的桥梁;(这部分数据可以自己构造)
问最少还需要修建多少条桥梁?
比如:
有 5 个岛屿 2 座桥,桥为:1->2; 3->5; 则至少建 2 座桥能使这 5 个岛屿互通。
请设计合理的逻辑结构和存储结构,以及操作算法完成上述工作。
示例:
输入:
5 2
1 2
3 5
输出:
2
参考解法:
/*
* bridge.c
*
* Created on: Jun 17, 2022
* Author: jyh
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct _island_link{
int Island_Number;
struct _island_link* next;
}IslandLink;
typedef struct _island_menu{
IslandLink* head;
IslandLink* tail;
int linkcount;
struct _island_menu* next;
struct _island_menu* front;
}IslandMenu;
typedef struct _list{
IslandMenu* head;
IslandMenu* tail;
}List;
void init(List* plist, int islandCount);
IslandMenu* checkIsland(List* plist, int islandNo);
void copy(IslandMenu* startp, IslandLink* p);
int main(){
int island, bridge;
int start, end;
int count;
List list;
IslandMenu* startp = (IslandMenu*)malloc(sizeof(IslandMenu));
IslandMenu* endp = (IslandMenu*)malloc(sizeof(IslandMenu));
scanf("%d", &island);
scanf("%d", &bridge);
count = island - 1;
init(&list, island);
for(int i = 0; i < bridge; i++){
scanf("%d %d", &start, &end);
startp = checkIsland(&list, start);
endp = checkIsland(&list, end);
if(startp != endp){
IslandLink* p = (IslandLink*)malloc(sizeof(IslandLink));
for(p = endp->head; p; p = p->next){
copy(startp, p);
}
startp->linkcount += endp->linkcount;
if(endp->next)endp->next->front = endp->front;
endp->front->next = endp->next;
free(endp);
free(p);
count--;
}
}
printf("%d", count);
return 0;
}
void init(List* plist, int islandCount){
plist->head = NULL;
plist->tail = NULL;
for(int count = 1;count <= islandCount; count++){
IslandMenu* p = (IslandMenu*)malloc(sizeof(IslandMenu));
IslandLink* q = (IslandLink*)malloc(sizeof(IslandLink));
q->Island_Number = count;
q->next = NULL;
p->linkcount = 1;
p->head = q;
p->tail = q;
p->next = NULL;
p->front = NULL;
if(plist->tail){
p->front = plist->tail;
plist->tail->next = p;
plist->tail = plist->tail->next;
}
else {
plist->head = p;
plist->tail = plist->head;
}
}
}
IslandMenu* checkIsland(List* plist, int islandNo){
IslandMenu* p = (IslandMenu*)malloc(sizeof(IslandMenu));
IslandLink* q = (IslandLink*)malloc(sizeof(IslandLink));
for(p = plist->head; p; p = p->next)
for(q = p->head; q; q = q->next)
if(q->Island_Number == islandNo)
return p;
exit(1);
return NULL;
}
void copy(IslandMenu* startp, IslandLink* p){
IslandLink* q = (IslandLink*)malloc(sizeof(IslandLink));
memcpy(q, p, sizeof(IslandLink));
startp->tail->next = q;
startp->tail = startp->tail->next;
}