#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <map>
using namespace std;
const int maxn=1050;
const int inf=10000000000;
int G[maxn][maxn];
int N,M,K,Ds,T;
int d[maxn];
bool vis[maxn];
void Dij(int st,int &mind,int &t,bool &flag)
{
fill(d,d+maxn,inf);
memset(vis,false,sizeof(vis));
d[st]=0;
for(int i=1;i<=T;i++)
{
int u=-1,MIN=inf;
for(int j=1;j<=T;j++)
{
if(vis[j]==false&&d[j]<MIN)
{
MIN=d[j];
u=j;
}
}
if(u==-1)return;
vis[u]=true;
if(u<=N)
{
if(d[u]>Ds)flag==false;
if(d[u]<mind)
{
mind=d[u];
}
t+=d[u];
}
for(int v=1;v<=T;v++)
{
if(vis[v]==false&&G[u][v]<inf)
{
if(d[u]+G[u][v]<d[v])
{
d[v]=d[u]+G[u][v];
}
}
}
}
}
void change(char c[],int &index)
{
int result=0;
if(c[0]=='G')
{
for(int i=1;i<strlen(c);i++)
{
result=result*10+c[i]-'0';
}
index=N+result;
}
else
{
for(int i=0;i<strlen(c);i++)
{
result=result*10+c[i]-'0';
}
index=result;
}
}
int main()
{
scanf("%d%d%d%d",&N,&M,&K,&Ds);
T=N+M;
fill(G[0],G[0]+maxn*maxn,inf);
char c1[10],c2[10];
int d;
for(int i=0;i<K;i++)
{
scanf("%s %s %d",&c1,&c2,&d);
int p1,p2;
change(c1,p1);
change(c2,p2);
G[p1][p2]=d;
G[p2][p1]=d;
}
int maxd=-1,totalD=inf,result=-1;
for(int i=1;i<=M;i++)
{
bool flag=true;
int tempd=inf,tempt=0;
Dij(N+i,tempd,tempt,flag);
if(flag)
{
if(tempd>maxd)
{
maxd=tempd;
totalD=tempt;
result=N+i;
}
else if(tempd==maxd)
{
if(tempt<totalD)
{
totalD=tempt;
result=N+i;
}
}
}
}
if(result==-1)
{
printf("No Solution\n");
}
else
{
printf("G%d\n",result-N);
printf("%.1f %.1f\n",maxd*1.0,totalD*1.0/N);
}
return 0;
}
PAT甲1072 Gas Station(30 分)
最新推荐文章于 2022-09-19 19:16:46 发布