VIJOS P1119 (NOIP2001 Problem4):Car的旅行路线 Accepted
2006-11-11 20:16
429 查看
描述 Description | ||
又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。 那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。 | ||
输入格式 Input Format | ||
第一行有四个正整数s,t,A,B。S(0<S<=100)表示城市的个数,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个城市高速铁路单位里程的价格。 | ||
输出格式 Output Format | ||
输出最小费用(结果保留两位小数) |
难点在于建图。
假设未知坐标为p4(x4,y4),已知坐标分别是p1(x1,y1) p2(x2,y2) p3(x3,y3)
先根据垂直向量积为零判断每个矩形缺失的坐标位置,如果p1是p4的对角,则
(x3-x1)(x2-x1)+(y3-y1)(y2-y1)=0
由中点公式易知
x4=x3+x2-x1
y4=y3+y2-y1
下面可以开始构图了。
我构图的方案是以城市为单位,先计算内部火车线路之间的边权(火车价格*距离),然后计算该城市各机场与其他城市每一个机场之间的边权(飞机单价*距离)。这样完成以后就得到一张稠密的无向图。剩下的工作就是最短路径的标程了。
还值得注意的一点是,Dijkstra开始的时候应该把起始城市的4个机场最短距离都设为0。
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include<stdio.h>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include<math.h>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#include<stdbool.h>
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
#define BIG 999999.0
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
void Dijkstra(void);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
float dist(float x1,float y1,float x2,float y2);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
void construct(void);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
typedef struct
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
float x,y;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}Point;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
Point ct[100][4];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int rail[100];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int s,t,a,b;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
float dis[100];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
float g[400][400];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
int main(void)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int i,j,k;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
float answer=BIG;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
FILE *fin=stdin;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
fscanf(fin,"%d %d %d %d ",&s,&t,&a,&b);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(i=0;i<s;i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
fscanf (
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
fin,"%f %f %f %f %f %f %d ",
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
&ct[i][0].x,&ct[i][0].y,
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
&ct[i][1].x,&ct[i][1].y,
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
&ct[i][2].x,&ct[i][2].y,
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
&rail[i]
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
construct();//构图
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Dijkstra();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for (i=0;i<4;i++)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(dis[(b-1)*4+i]<answer)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
answer=dis[(b-1)*4+i];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
printf("%.2f ",answer);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 0;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
void construct(void)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int i,j,k,l;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for (i=0;i<s;i++)...{ //计算第四个点的坐标
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if((ct[i][1].x-ct[i][0].x)*(ct[i][2].x-ct[i][0].x)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
+(ct[i][1].y-ct[i][0].y)*(ct[i][2].y-ct[i][0].y)==0)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ct[i][3].x=ct[i][2].x+ct[i][1].x-ct[i][0].x;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ct[i][3].y=ct[i][2].y+ct[i][1].y-ct[i][0].y;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}else if((ct[i][0].x-ct[i][1].x)*(ct[i][2].x-ct[i][1].x)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
+(ct[i][0].y-ct[i][1].y)*(ct[i][2].y-ct[i][1].y)==0)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ct[i][3].x=ct[i][2].x+ct[i][0].x-ct[i][1].x;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ct[i][3].y=ct[i][2].y+ct[i][0].y-ct[i][1].y;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}else if((ct[i][0].x-ct[i][2].x)*(ct[i][1].x-ct[i][2].x)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
+(ct[i][0].y-ct[i][2].y)*(ct[i][1].y-ct[i][2].y)==0)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ct[i][3].x=ct[i][1].x+ct[i][0].x-ct[i][2].x;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
ct[i][3].y=ct[i][1].y+ct[i][0].y-ct[i][2].y;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for(i=0;i<s;i++)...{//以城市为单位构图
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(j=0;j<4;j++)//城市内部
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(k=0;k<4;k++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
g[4*i+j][4*i+k]=
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
rail[i]*dist(ct[i][j].x,ct[i][j].y,ct[i][k].x,ct[i][k].y);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for(j=0;j<s;j++)...{//城市之间
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(j==i)continue;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(k=0;k<4;k++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(l=0;l<4;l++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
g[4*i+k][4*j+l]=
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
t*dist(ct[i][k].x,ct[i][k].y,ct[j][l].x,ct[j][l].y);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
float dist(float x1,float y1,float x2,float y2)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
void Dijkstra(void)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int i,j;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int min=BIG,minn;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
bool vis[100];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
memset(vis,0,sizeof(vis));
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
for(i=0;i<s*4;i++)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
dis[i]=BIG;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
dis[a-1]=dis[a]=dis[a+1]=dis[a+2]=0;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for(i=0;i<s*4;i++)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
min=BIG;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for(j=0;j<s*4;j++)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
if(!vis[j] && dis[j]<min)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
min=dis[j];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
minn=j;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
vis[minn]=true;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
for(j=0;j<4*s;j++)...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
if(min+g[minn][j]<dis[j])
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
dis[j]=dis[minn]+g[minn][j];
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
相关文章推荐
- 【codevs 1041】【vijos P1119】[NOIP提高组2001] Car的旅行路线(最短路)
- [NOIP2001][vijos1119]Car的旅行路线(dijkstra堆优化)
- 【最短路】【NOIP2001】CAR的旅行路线
- [Wikioi 1041][NOIP 2001提高组]Car的旅行路线(疑难题)
- ACM 95. [NOIP2001] Car的旅行路线(最短路)
- NOIP 2001 Car的旅行路线
- [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)
- NOIP 2001 Car的旅行路线 解题报告
- [NOIP2001] 提高组 洛谷P1027 Car的旅行路线
- [NOIP提高组2001]Car的旅行路线
- noip2001 car的旅行路线 (floyd求解最短路径长度)
- NOIP2001 Car的旅行路线
- [NOIP2001]Car的旅行路线
- 【NOIP 2001提高组】Car的旅行路线(car.cpp)
- noip2001-4 Car的旅行路线
- 【最短路】【NOIP2001】CAR的旅行路线
- NOIP2001 Car的旅行路线
- 洛谷 P1027 CODE[VS] 1041 [NOIP2001 T4] Car的旅行路线
- 【noip2001 提高组T4】 Car的旅行路线 预处理+最短路
- [NOIP 2001提高组T4]Car的旅行路线