使用最短路问题 也就是Dijkstra算法 本质上就是贪心
这个算法讲解的链接 单机此处可以获得
理解了这个算法的本质上就是贪心的之后那么就好做了
/* 问题描述
又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一 条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。
那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。
输入格式
的第一行有四个正整数s,t,A,B。
S表示城市的个数,t表示飞机单位里程的价格,A,B分别为城市A,B的序号,(1<=A,B<=S)。
接下来有S行,其中第I行均有7个正整数xi1,yi1,xi2,yi2,xi3,yi3,Ti,这当中的(xi1,yi1),(xi2,yi2),(xi3,yi3)分别是第I个城市中任意三个机场的坐标,T I为第I个城市高速铁路单位里程的价格。
输出格式
共有n行,每行一个数据对应测试数据,保留一位小数。
样例输入
1 10 1 1
1 1 2 2 2 1 10
1
3 10 1 3
1 1 1 3 3 1 30
2 5 7 4 5 2 1
8 6 8 8 11 6 3
样例输出
47.55
数据规模和约定
0<S<=100,
*/
#include <stdio.h>
#include <math.h>
#define q(i) ((i+2)%3)
#define h(i) ((i+1)%3)
#define INF (99999.0)
typedef struct{
double x[4],y[4],v_t,lf[4];
}ct_t;
void output(ct_t*);
double dis(double,double,double,double);
void solve(int,int,int,ct_t[],int[]);
void q_zb(ct_t*);
void input(int,ct_t[],int);
int main(void)
{
int nur_c,v_fly,nur_a,nur_b,mark[100] = {1};
scanf("%d%d%d%d",&nur_c,&v_fly,&nur_a,&nur_b);
nur_a--;
nur_b--;
ct_t ct[nur_c];
input(nur_c,ct,nur_a);
solve(v_fly,nur_a,nur_c,ct,mark);
output(ct+nur_b);
return 0;
}
void output(ct_t* c)
{
int i;
double min = INF;
for(i = 0;i < 4;i++)
{
if(min > c->lf[i])
{
min = c->lf[i];
}
}
printf("%.1lf",min);
}
/*
3 10 1 3
2 2 2 1 1 2 10
2 12 12 2 22 12 1
22 22 22 32 32 22 10
*/
double dis(double x,double y,double xx,double yy)
{
return sqrt((xx-x)*(xx-x) + (yy-y)*(yy-y));
}
void solve(int fly,int dq,int n,ct_t ct[],int m[])
{
if(dq == -1)
{
return;
}
m[dq] = 1;
int i,k,kk,index = -1,min = INF;
for(i = 0;i < n;i++)
{
if(!m[i])
{
for(k = 0;k < 4;k++)
{
for(kk = 0;kk < 4;kk++)
{
double d = dis(ct[dq].x[k],ct[dq].y[k],ct[i].x[kk],ct[i].y[kk])*fly+ct[dq].lf[k];
ct[i].lf[kk] = d < ct[i].lf[kk] ? d : ct[i].lf[kk];
}
}
for(k = 0;k < 4;k++)
{
for(kk = 0;kk < 4;kk++)
{
if(kk == k)
{
continue;
}
double d = dis(ct[i].x[k],ct[i].y[k],ct[i].x[kk],ct[i].y[kk])*ct[i].v_t+ct[i].lf[kk];
ct[i].lf[k] = d < ct[i].lf[k] ? d : ct[i].lf[k];
if(ct[i].lf[k] < min)
{
min = ct[i].lf[k];
index = i;
}
}
}
}
}
solve(fly,index,n,ct,m);
}
void q_zb(ct_t*c)
{
int i;
double sz[4];
for(i = 0;i < 3;i++)
{
sz[0] = c->x[q(i)]-c->x[i];
sz[1] = c->y[q(i)]-c->y[i];
sz[2] = c->x[h(i)]-c->x[i];
sz[3] = c->y[h(i)]-c->y[i];
if(fabs(sz[0]*sz[2]+sz[1]*sz[3]) <= 1e-6)
{
c->x[3] = c->x[q(i)]+c->x[h(i)] - c->x[i];
c->y[3] = c->y[q(i)]+c->y[h(i)] - c->y[i];
break;
}
}
}
void input(int nur_c,ct_t ct[],int a)
{
int i;
for(i = 0;i < nur_c;i++)
{
scanf("%lf%lf%lf%lf%lf%lf%lf",ct[i].x,ct[i].y,ct[i].x+1,ct[i].y+1,ct[i].x+2,ct[i].y+2,&(ct[i].v_t));
q_zb(ct+i);
ct[i].lf[0] = INF;
ct[i].lf[1] = INF;
ct[i].lf[2] = INF;
ct[i].lf[3] = INF;
}
ct[a].lf[0] = 0.;
ct[a].lf[1] = 0.;
ct[a].lf[2] = 0.;
ct[a].lf[3] = 0.;
}