垃圾箱分布——最短路Dijkstra
时间:2019-03-25
本文章向大家介绍垃圾箱分布——最短路Dijkstra,主要包括垃圾箱分布——最短路Dijkstra使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
此题的关键就是把垃圾想的编号Gxxx 转换成数字编号
我是把Gxx 转换成N+1 到N+M
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define INF 0x3f3f3f
int N, M, K, D;//N居民点的个数, M垃圾箱的候选地点, K道路条数,居民点与垃圾箱的不能超过的最大距离
int map[1300][1300];//邻接矩阵储存
int min;//最小距离
double ave;//平均距离
int Gx;//储存最优垃圾箱位置编号
int flag;
void Dijkstra(int s)
{
int i, j;
int dis[1300];//储存 各个点到s的距离
int book[1300];//标记函数
memset(dis, INF, sizeof(dis));
memset(book, 0, sizeof(book));
dis[s] = 0;
for(i = 1;i <= N+M;i++)
{
dis[i] = map[s][i];
}
for(i = 1;i < N+M;i++)
{
int u = INF;//储存到该点最近的顶点
int min = INF;//储存距离
for(j = 1;j<= M+N;j++)
{
if(book[j] == 0 && dis[j] < min)
{
min = dis[j];
u = j;
}
}
book[u] = 1;
for(j = 1;j <= N+M;j++)
{
if(dis[j] > dis[u]+ map[u][j])
{
dis[j] = dis[u]+map[u][j];
}
}
}
int nmin, nsum = 0;
double nave;
for(i = 1;i <= N;i++)
{
nsum+=dis[i];
if(i == 1)nmin = dis[i];
else if(nmin > dis[i])nmin = dis[i];
if(dis[i] > D)return;//不符合条件结束
}
nave = nsum/(N*1.0);
if(flag == 0)
{
flag = 1;
Gx = s;
min = nmin;
ave = nave;
}
else if(nmin > min)
{
min = nmin;
Gx = s;
ave = nave;
}
else if(nmin == min && nave < ave)
{
Gx = s;
min = nmin;
ave = nave;
}
}
int tran(char str[])//转换函数
{
int i;
int num = 0;
if(str[0] == 'G')
{
i = 1;
while(str[i]!= '\0')
{
num*=10;
num+=(str[i]-'0');
i++;
}
num = num+N;
}
else
{
i= 0;
while(str[i]!= '\0')
{
num *= 10;
num += (str[i]-'0');
i++;
}
}
return num;
}
int main()
{
memset(map, INF, sizeof(map));//初始化图
int i;
scanf("%d %d %d %d", &N, &M, &K, &D);
for(i = 1;i<= K;i++)
{
char vex1[15], vex2[15];
int w;
scanf("%s %s %d", vex1, vex2, &w);
//转换成int型编号,垃圾箱从N+1开始排到N+M
int v1 = tran(vex1);
int v2 = tran(vex2);
map[v1][v2] = map[v2][v1] = w;
}
flag = 0;//开始标记为0 表示没有找到
for(i = 1+N;i<= N+M;i++)//求最短路过程
{
Dijkstra(i);
}
if(flag == 1)
{
printf("G%d\n", Gx - N);
printf("%.1lf %.1lf", (double)min, ave);
}
else printf("No Solution");
return 0;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法