L3-005 垃圾箱分布(dijstra)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leekerian/article/details/88828019

对每个垃圾桶暴力dijstra

#include <iostream>
#include <algorithm>

using namespace std;
#define INF 0x3f3f3f3f

int map[1111][1111];
int vis[1111];
int dis[1111];
int n,m,k,ds;

void dijstra(int k)
{
    for(int i=1;i<=n+m;i++)
    {
        vis[i]=0;dis[i]=INF;
    }
    dis[k]=0;
    for(int i=1;i<=n+m;i++)
    {
        int max1=INF;
        int t=-1;
        for(int j=1;j<=m+n;j++)
        {
            if(!vis[j]&&dis[j]<max1)
            {
                max1=dis[j];
                t=j;
            }
        }
        if(t==-1) break;
        vis[t]=1;
        for(int j=1;j<=m+n;j++)
        {
            if(!vis[j]&&dis[t]+map[t][j]<dis[j])
                dis[j]=dis[t]+map[t][j];
        }
    }
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&k,&ds); 
    for(int i=0;i<1111;i++)
        for(int j=0;j<1111;j++)
            map[i][j]=INF;
    for(int i=0;i<k;i++)
    {
        char str1[5],str2[5];
        int t,x,y;
        scanf("%s%s%d",str1,str2,&t);
        if(str1[0]=='G')
        {
            x=0;
            for(int j=1;str1[j]!='\0';j++)
                x=x*10+str1[j]-'0';
            x+=n;
        }
        else
        {
            x=0;
            for(int j=0;str1[j]!='\0';j++)
                x=x*10+str1[j]-'0';
        }
        if(str2[0]=='G')
        {
            y=0;
            for(int j=1;str2[j]!='\0';j++)
                y=y*10+str2[j]-'0';
            y+=n;
        }
        else
        {
            y=0;
            for(int j=0;str2[j]!='\0';j++)
                y=y*10+str2[j]-'0';
        }
        map[x][y]=t;
        map[y][x]=t;
    }
    int flag1=0;
    int num1;
    double sum1;
    double max2=-1;
    for(int i=n+1;i<=n+m;i++)
    {
        dijstra(i);
        int flag=1;
        double max1=1e18;
        double sum=0;
        for(int i=1;i<=n;i++)
        {
            if(dis[i]>ds)  
            {
                flag=0;
                break;
            }
            max1=min(max1,dis[i]*1.0);
            sum+=dis[i]*1.0;
        }
        if(!flag) continue;
        else
        {
            flag1=1;
            if(max1>max2)
            {
                num1=i;
                sum1=sum/(n*1.0);
                max2=max1;
            }
            else if(max1==max2)
            {
                if((sum/(n*1.0))<sum1)
                {
                    num1=i;
                    sum1=sum/(n*1.0);
                }  
                else if((sum/(n*1.0))==sum1)
                {
                    if(i<num1)
                        num1=i;
                }
            }
        }
    }
    if(!flag1) printf("No Solution\n");
    else
    {
        printf("G%d\n",num1-n);
        printf("%.1lf %.1lf\n",max2,sum1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/leekerian/article/details/88828019
今日推荐