版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengchencheng/article/details/82878583
1.最少修建多长的公路能把所有村庄连起来(一)
描述:一个地区有n个村庄,有一些村子之间可以修路,已知每条路的长度,问最少修建多长的公路可以把所有的村子连接起来。
输入:先输入两个正整数n,m(n小于10000,m小于100000),表示有n个村庄,m条可以修建的路,接下来的m行每行三个整数,前两个表示村庄的编号(0~n-1),第三个表示这条路的长度。
输出:输出路的总长度的最小值。
输入样例
4 5
0 1 10
0 2 13
1 2 1
1 3 5
3 0 8
输出样例
14
#include<iostream>
#include<stdlib.h>
#define MAX 100000
using namespace std;
void init();
void find();
typedef struct node{
int num;
int len;
node* next;
}node;
typedef struct road{
node* matrix[10001];
}road;
road *p = (road*)malloc(sizeof(road));
int n, m;
int a[10001];
int FLAG = 1;
int cnt = 0;
int main(){
init();
find();
cout << cnt << endl;
}
void init(){
int u, v, s;
cin >> n >> m;
node *r;
for(int i = 0; i < n; i++){
p->matrix[i] = NULL;
a[i] = 1;
}
for(int i = 0; i < m; i++){
cin >> u >> v >> s;
//将与v相连的数字储存,两点间距离储存在p->matrix[v]中
node *q1 = (node*)malloc(sizeof(node));
q1->num = u;
q1->len = s;
if(p->matrix[v] == NULL || p->matrix[v]->num <= u){
q1->next = p->matrix[v];
p->matrix[v] = q1;
}
else{
r = p->matrix[v];
while(r->next->num > u){
r=r->next;
}
q1->next = r->next;
r->next = q1;
}
//将与u相连的数字储存,两点间距离储存在p->matrix[u]中
node *q2 = (node*)malloc(sizeof(node));
q2->num = v;
q2->len = s;
if(p->matrix[u] == NULL || p->matrix[u]->num <= v){
q2->next = p->matrix[u];
p->matrix[u] = q2;
}
else{
r = p->matrix[u];
while(r->next && r->next->num > v){
r = r->next;
}
q2->next = r->next;
r->next = q2;
}
}
a[0] = 0;
}
void find(){
int min, tmp;
int i;
node* r;
while(FLAG){
FLAG = 0;
min = MAX;
//一次搜索所有距集合中的节点最短路径的新节点
for(i = 0; i < n; i++){
if(a[i] == 0){
r = p->matrix[i];
while(r != NULL){
if(r->len < min && a[r->num]){
tmp = r->num;
min = r->len;
}
r = r->next;
}
}
else{
FLAG = 1;
}
}
if(FLAG != 0){
cnt+=min;
a[tmp] = 0;
min = MAX;
}
}
}
2.最少修建多长的公路能把所有村庄连起来(二)
描述:一个地区有n个村庄,有一些村子之间可以修路,已知每条路的长度,问最少修建多长的公路可以把所有的村子连接起来。
输入:先输入一个正整数n(n小于500),表示有n个村庄,接下来n行每行n个正整数,其中第i行第j列的元素表示第i个村庄到第j个村庄之间的距离。
输出:输出路的总长度的最小值。
输入样例
3
0 1 5
1 0 2
5 2 0
输出样例
3
#include<iostream>
#define MAX 100000
using namespace std;
void search();
int arr[502][502];
bool flag[502];
int n;
int cnt = 0;
int main(){
int i, j;
cin >> n;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
cin >> arr[i][j];
}
flag[i] = true;
}
flag[0] = false;
search();
cout << cnt <<endl;
}
void search(){
int FLAG = 1;
int min, tmp;
while(FLAG){
FLAG = 0;
min = MAX;
for(int i = 0; i < n; i++){
if(flag[i]){
FLAG = 1;
}
else{
for(int j = 0; j < n; j++){
if(i != j && arr[i][j] < min && flag[j]){
min = arr[i][j];
tmp = j;
}
}
}
}
if(FLAG == 1){
flag[tmp] = false;
cnt += min;
}
}
}