垃圾箱分布——最短路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;
}