1072. Gas Station (30)

来源:互联网 发布:软件集成测试 编辑:程序博客网 时间:2024/05/20 05:29
#include<algorithm>#include<cstdio>#include<cstring>using namespace std;#define maxn 1020#define INF  1000000000int n,m,k,ds,n_all=0;int G[maxn][maxn],vis[maxn]={false},d[maxn];int all_dis=0,min_dis=INF,flag=0,all_flag=0,ans_sta=INF,ans_min=0;double dis_avg=0,ans_avg=INF;int changetonum(char str[]){  int x=0,len = strlen(str);  if(str[0] == 'G')  {    for(int j=1; j<len; j++)      x = x*10 + (str[j] - '0');    x += n;  }  else  {    for(int j=0; j<len; j++)      x = x*10 + (str[j] - '0');  }  return x;}void dijstra(int s){  //初始化  d[s] = 0;  //n次循环,1开始,nall结束  for(int i=1; i<=n_all;  i++)  {    //找距离最小的    int u = -1,MIN = INF;    for(int j=1; j<=n_all; j++)    {      if(vis[j] == false && d[j]<MIN)      {        u = j;        MIN = d[j];      }    }    if(u == -1)      return;    vis[u] = true;    //更新最短距离    for(int v=1; v<=n_all; v++)    {      if(vis[v]==false && G[u][v] != INF && (d[u]+G[u][v])<d[v])      {        d[v] = d[u] + G[u][v];      }    }  }}int main(){  //输入数据  fill(G[0],G[0]+maxn*maxn,INF);    scanf("%d%d%d%d",&n,&m,&k,&ds);  n_all = n+m;  //构造图  for(int j=0; j<k; j++)  {    char str1[6],str2[6];    int a,b,v;    scanf("%s%s %d",str1,str2,&v);    a = changetonum(str1);    b = changetonum(str2);    G[a][b] = G[b][a] = v;  }  //循环遍历图,找到最优解  for(int i=n+1; i<=n+m; i++)  {    //初始化    fill(d, d+maxn, INF);    fill(vis, vis+maxn, false);    flag = 0;    min_dis = INF;    all_dis = 0;    dijstra(i);    for(int x=1; x<=n; x++)    {      //是否超过服务范围      if(d[x]>ds)      {        all_flag +=1; //flag加1,如果为m,则所有都不符合!        flag = 1;        break;      }      if(d[x]<min_dis)      {        min_dis = d[x];      }      all_dis += d[x];    }    dis_avg = all_dis*1.0/n;    //在服务范围内    if(flag == 0)    {      //找到了最安全的距离      if(min_dis > ans_min)      {        //全部更新        ans_min = min_dis;        ans_avg = dis_avg;        ans_sta = i;      }      else if(min_dis == ans_min)      {        //找平均距离最小的        if(dis_avg < ans_avg)        {          ans_avg = dis_avg;          ans_sta = i;        }        else if(dis_avg == ans_avg)        {          //找节点小的          if(i < ans_sta)            ans_sta = i;        }      }    }  }  //输出最优解  if(all_flag == m)  {    printf("No Solution");  }  else  {    printf("G%d\n",ans_sta-n);    printf("%d.0 %.1f",ans_min,ans_avg);  }  return 0;}

0 0
原创粉丝点击