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