PAT甲1072. Gas Station (30)

#include <cstdio>
#include <cstdlib>
#include <map>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

const int maxn=1100;
const int inf=100000000;
int N,M,K,Ds;
bool vis[maxn]={false};
int d[maxn];
vector<int> pre[maxn];
struct node
{
    int v;
    int x;
    node(int _v,int _x )
    {
        v=_v;
        x=_x;
    }
};

vector<node> G[maxn];

int change(string s)
{
    int result=0;
    bool st=false;
    if(s[0]=='G')
    {
        st=true;
        s.erase(s.begin()+0);
    }
    for(int i=0;i<s.length();i++)
    {
        result=result*10+s[i]-'0';
    }
    if(st)
    {
        result+=N;
    }
    return result;
}

struct sta
{
    int i;
    int dis;
    bool ser;
    int mini;
    sta()
    {
        mini=inf;
        ser=true;
        dis=0;
    }
}stat[12];

void initsta()
{
    for(int i=0;i<12;i++)
        stat[i].i=i;
}

bool cmp(sta a,sta b)
{
    if(a.mini==b.mini&&a.dis==b.dis)return a.i<b.i;
    else if(a.mini==b.mini)return a.dis<b.dis;
    else return a.mini>b.mini;
}

 int dis[12];
 bool ser[12]={true};
 int Mini[12]={inf};

void Dij(int st)
{
    fill(d,d+maxn,inf);
    fill(vis,vis+maxn,false);
    d[st]=0;
    for(int i=1;i<=N+M;i++)
    {
        int u=-1,MIN=inf;
        for(int j=1;j<=N+M;j++)
        {
            if(vis[j]==false&&d[j]<MIN)
            {
                u=j;
                MIN=d[j];
            }
        }
        if(u==-1)return;
        vis[u]=true;
        if(u>=1&&u<=N)
        {
            int index=st-N;
            stat[index].dis+=d[u];
            if(d[u]>Ds)
            {
                stat[index].ser=false;
            }
            if(d[u]<stat[index].mini)
            {
                stat[index].mini=d[u];
            }
        }
        for(int j=0;j<G[u].size();j++)
        {
            if(vis[G[u][j].v]==false)
            {
                if(d[u]+G[u][j].x<d[G[u][j].v])
                {
                    d[G[u][j].v]=d[u]+G[u][j].x;
                    pre[G[u][j].v].clear();
                    pre[G[u][j].v].push_back(u);
                }
                else if(d[u]+G[u][j].x==d[G[u][j].v])
                {
                    pre[G[u][j].v].push_back(u);
                }
            }
        }
    }
}



int main()
{
    scanf("%d%d%d%d",&N,&M,&K,&Ds);
    initsta();
    for(int i=0;i<K;i++)
    {
        string s1,s2;
        int c1,c2,v;
        cin>>s1>>s2>>v;
        c1=change(s1);
        c2=change(s2);
        G[c1].push_back(node(c2,v));
        G[c2].push_back(node(c1,v));
    }
    for(int i=N+1;i<=N+M;i++)
    {
        Dij(i);
    }
    sort(stat+1,stat+M+1,cmp);
    int it;
    bool flag=false;
    for(it=1;it<=M;it++)
    {
        if(stat[it].ser==true)
        {
            flag=true;
            printf("G%d\n",stat[it].i);
            double mini=stat[it].mini;
            double ave=stat[it].dis*1.0/N;
            printf("%.1f %.1f",mini,ave);
            break;
        }
    }
    if(!flag)
    {
        printf("No Solution\n");
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yhy489275918/article/details/80246766