垃圾箱分布——最短路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;
}
标签:nave,min,int,短路,Dijkstra,num,垃圾箱,nmin,dis 来源: https://blog.csdn.net/qq_43824791/article/details/88801894