#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INF 0x3f3f3f3f
int ma[121][121];//存储电网
int q;//存路径条数
int dist[1211];//存储距离
int v[1211];//是否被访问
int ka[121];//当前路径的前一个节点
typedef struct
{
int s, e;//开始点,结束点
int cost;//权值,电网造价
} Edge;
Edge Road[1211];//存路径
void Prim(int n, int m)
{
int i, j;
memset(v, 0, sizeof(v));//初始化节点
v[0] = 1;//0开始的顶点
dist[0] = 0;//距离
for(i=0; i<=n; i++)//从当前点开始,到达每一个点的距离
{
dist[i] = ma[0][i];//
ka[i] = 0;//记录出度为当前点的入度
}
long long int sum = 0;//计算所需要的花费
int Min, point;
for(i=1; i<n; i++)//遍历所有点
{
point = 0;
Min = INF;
for(j=0; j<n; j++)//寻找,没有被访问的到达此点边权最小的点
{
if(dist[j]<Min&&v[j]==0)
{
point = j;
Min = dist[j];
}
}
if(point==0)//如果没有更新,退出
{
printf("抱歉,您的操作无法完成!\n");
return;
}
v[point] = 1;//标记被访问
sum = sum + Min;//更新花费
Road[++q].s = ka[point];//加入路径
Road[q].e = point;
Road[q].cost = ma[i][point];
for(j=0; j<n; j++)//遍历所有点,更新信息
{
if(v[j]==0&&ma[point][j]<dist[j])
{
dist[j] = ma[point][j];
ka[j] = point;
}
}
}
printf("您所需要的费用是:%lld\n", sum);//输出费用
for(i=1; i<=q; i++)//输出路径
printf("%d --> %d\n", Road[i].s, Road[i].e);
}
int main()
{
int i, j, cost;
int n, m;//存储城市数目,电网线路数目
char Case[121];
while(1)
{
printf("*************************************\n");
printf(" 请选择指令类型: *\n");
printf(" 1 --> 输入电网 *\n");
printf(" 2 --> 退出 *\n");
printf("*************************************\n");
scanf("%s", Case);
if(strcmp(Case, "1")==0)//输入电网
{
printf("请输入城市个数和电网数(数字在0-100之间):\n");
while(~scanf("%d %d", &n, &m))
{
if(n<=0||m<=0||n>100||m>100)//不合法则继续输入
printf("请输入合法的数字:\n");
else
break;
}
int sa, ea;//输入的两个有电网的城市
q = 0;
for(i=0; i<=n; i++)//初始化
{
for(j=0; j<=n; j++)
{
ma[i][j] = INF;
}
}
for(i=0; i<m; i++)
{
scanf("%d %d %d", &sa, &ea, &cost);
if(sa>n||ea>n||cost<0||sa<0||ea<0)
printf("请输入合法的数字(0-城市数目之间):\n");
else if(ma[sa][ea]>cost)
{
ma[sa][ea] = ma[ea][sa] = cost;//无向图
}
}
Prim(n, m);
}
else if(strcmp(Case, "2")==0)//退出
{
printf("感谢您的使用!\n");
break;
}
else //指令错误
{
printf("请输入正确的数字:\n");
}
}
return 0;
}
电网项目
最新推荐文章于 2024-07-07 03:48:33 发布