7-50 畅通工程之局部最小花费问题 (35 分)(思路加详解)来呀兄弟们冲呀呀呀呀呀呀呀

一:题目

某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全地区畅通需要的最低成本。

输入格式:
输入的第一行给出村庄数目N (1≤N≤100);随后的N(N−1)/2行对应村庄间道路的成本及修建状态:每行给出4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态 — 1表示已建,0表示未建。

输出格式:
输出全省畅通需要的最低成本。

输入样例:

4
1 2 1 1
1 3 4 0
1 4 1 1
2 3 3 0
2 4 2 1
3 4 5 0

输出样例:

3

二:思路

这个就是Prime算法的变型,我想的是如果这条路是已经修过,那么的话就将其的权值你设为0

三:上码

/**
	
	思路:如果是已经修过,那么的话就将其的权值你设为0
	 
*/ 
#include<bits/stdc++.h>
using namespace std;

typedef struct GNode* PtrGraph;

typedef struct GNode{
	int Nv;
	int Ne;
	int Data[105][105];
}gnode;

int N;
//利用邻接矩阵储存图的基本信息
void CreateGraph(PtrGraph G){
	
	cin >> N;
	
	G->Nv = N;
	G->Ne = N*(N-1)/2;
	
	//矩阵初始化 
	for(int i = 1; i <= G->Nv; i++){
		for(int j = 1; j <= G->Nv; j++){
			
			G->Data[i][j] = 0; 
		}
	}
	
	//矩阵赋值
	
	for(int i = 0; i < G->Ne; i++){
		int a,b,c,d;
		cin >> a >> b >> c >> d; 
		
		if(d == 0){
			G->Data[a][b] = c;
			G->Data[b][a] = c; 
		} 		
	} 		
} 
//输出矩阵 
void print_Graph(PtrGraph G){
	
	for(int i = 1; i <= G->Nv; i++){
		for(int j = 1; j <= G->Nv; j++){
			cout << G->Data[i][j] << ' ';
		}
		cout << endl;
	}
} 

//Prime最小成树的算法
void Prime(PtrGraph G){
	int dist[105];
	int visited[105] = {0};
	int count = 0;
	
	for(int i = 1; i <= G->Nv; i++){
		dist[i] = G->Data[1][i];//将符号为1到其他点的距离存在  dist数组中 
	}
	
	visited[1] = 0;
	count++;
	
	while(1){
		
		int m = -1;
		int infinite = 9999;
		
		//求取最小值
		for(int i = 1; i <= G->Nv; i++){
			if(dist[i] < infinite && visited[i] != 1){
				infinite = dist[i];
				m = i;
			}
		}
		
		visited[m] = 1;
		count++;
		
		if(m == -1){
			break;
		} 
		
		//更新
		for(int i = 1; i <= G->Nv; i++){
			
			if(visited[i] != 1 && G->Data[m][i] < dist[i] ){
					dist[i] = G->Data[m][i];
			}
		} 	
	} 
	
	int sum = 0;
	
	for(int i = 1; i <= G->Nv; i++){
		sum += dist[i];
	}
	
	cout << sum;
	
	
} 

int main(){
	
	PtrGraph G = (PtrGraph)malloc(sizeof(struct GNode));
	CreateGraph(G);
//	print_Graph(G);
	Prime(G);
	
	
}

在这里插入图片描述
加油BOY!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值