Car的旅行路线
2015-09-19 20:06
267 查看
描述
又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。
那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。
格式
输入格式
第一行有四个正整数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个城市高速铁路单位里程的价格。
输出格式
输出最小费用(结果保留两位小数)
样例1
样例输入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
样例输出1[复制]
47.55
限制
每个测试点1s
来源
NOIP2001第四题
题不难,但相当考验编程能力,,这题在考场上要有耐心
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<fstream> using namespace std; const int inf=1e9; int N,city_num,S,T; int fly_cost; int tot; struct node{ int x[5],y[5]; }Airport[200]; int road_cost[200]; int vis[200][200]; int to[200][200]; double cost[200][200]; double ANS; int min1(double a1,double a2){ if(a1<a2) return a1; else return a2; } void calc_roadcost(int xx){//计算机场之间的铁路费用,xx表示机场标号 for(int i=1;i<=4;i++){//机场标号 int u=4*(xx-1)+i;//在图中代表的点的标号 for(int j=1;j<=4;j++){//机场标号 int v=4*(xx-1)+j;//在图中代表的点的标号 if(u!=v&&vis[u][v]==0&&vis[v][u]==0){//如果不是同一个点,且没有建立过连接 vis[u][v]=1; vis[v][u]=1; int e=++to[u][0]; int r=++to[v][0]; to[u][e]=v; to[v][r]=u; double dis=((double)Airport[xx].x[i]-(double)Airport[xx].x[j])*((double)Airport[xx].x[i]-(double)Airport[xx].x[j])+ ((double)Airport[xx].y[i]-(double)Airport[xx].y[j])*((double)Airport[xx].y[i]-(double)Airport[xx].y[j]); dis=sqrt(dis); dis*=(double)road_cost[xx]; cost[u][e]=dis; cost[v][r]=dis; } } } } void calc_fly_cost(){//计算机场之间的航线费用 for(int i=1;i<=city_num;i++){//城市标号 for(int j=1;j<=4;j++){//城市中的机场 int u=4*(i-1)+j;//此机场在图中的标号 for(int k=1;k<=city_num;k++){//城市标号 if(k!=i){//保证不是同一个城市 for(int t=1;t<=4;t++){//城市中的机场 int v=4*(k-1)+t;//此机场在图中的标号 if(vis[u][v]==0&&vis[v][u]==0){//没有建立过连接 vis[u][v]=1; vis[v][u]=1; int e=++to[u][0]; int r=++to[v][0]; to[u][e]=v; to[v][r]=u; double dis=sqrt(((double)Airport[i].x[j]-(double)Airport[k].x[t])*((double)Airport[i].x[j]- (double)Airport[k].x[t])+((double)Airport[i].y[j]-(double)Airport[k].y[t])* ((double)Airport[i].y[j]-(double)Airport[k].y[t])); dis*=(double)fly_cost; cost[u][e]=dis; cost[v][r]=dis; } else continue; } } else continue; } } } } void SPFA(int s){ static queue<int> Q; double dis[200]; bool vis2[200]; for(int i=0;i<=199;i++) dis[i]=(double)inf; memset(vis2,false,sizeof(vis2)); while(Q.size()>0) Q.pop(); dis[s]=(double)0; Q.push(s); vis2[s]=true; while(Q.size()>0){ int x=Q.front(); Q.pop(); vis2[x]=false; for(int i=1;i<=to[x][0];i++){ int y=to[x][i]; if(dis[y]>dis[x]+cost[x][i]){ dis[y]=dis[x]+cost[x][i]; if(vis2[y]==false){ vis2[y]=true; Q.push(y); } } } } for(int i=1;i<=4;i++){ int v=4*(T-1)+i; if(dis[v]<(double)ANS){ ANS=dis[v]; } } } inline double calc_dis(int x1,int x2,int y1,int y2){//两点间距离的平方 return ((double)x1-(double)x2)*((double)x1-(double)x2)+ ((double)y1-(double)y2)*((double)y1-(double)y2); } int main(){ scanf("%d%d%d%d",&city_num,&fly_cost,&S,&T); tot=4*city_num; for(int j=1;j<=city_num;j++){ scanf("%d%d%d%d%d%d%d",&Airport[j].x[1],&Airport[j].y[1], &Airport[j].x[2],&Airport[j].y[2], &Airport[j].x[3],&Airport[j].y[3], &road_cost[j]); if(calc_dis(Airport[j].x[1],Airport[j].x[2],Airport[j].y[1],Airport[j].y[2])== calc_dis(Airport[j].x[1],Airport[j].x[3],Airport[j].y[1],Airport[j].y[3])+ calc_dis(Airport[j].x[2],Airport[j].x[3],Airport[j].y[2],Airport[j].y[3]) )//说明 3是直角顶点 Airport[j].x[4]=Airport[j].x[1]+Airport[j].x[2]-Airport[j].x[3], Airport[j].y[4]=Airport[j].y[1]+Airport[j].y[2]-Airport[j].y[3]; else if(calc_dis(Airport[j].x[1],Airport[j].x[3],Airport[j].y[1],Airport[j].y[3])== calc_dis(Airport[j].x[1],Airport[j].x[2],Airport[j].y[1],Airport[j].y[2])+ calc_dis(Airport[j].x[3],Airport[j].x[2],Airport[j].y[3],Airport[j].y[2]) )//说明 2是直角顶点 Airport[j].x[4]=Airport[j].x[1]+Airport[j].x[3]-Airport[j].x[2], Airport[j].y[4]=Airport[j].y[1]+Airport[j].y[3]-Airport[j].y[2]; else if(calc_dis(Airport[j].x[2],Airport[j].x[3],Airport[j].y[2],Airport[j].y[3])== calc_dis(Airport[j].x[2],Airport[j].x[1],Airport[j].y[2],Airport[j].y[1])+ calc_dis(Airport[j].x[3],Airport[j].x[1],Airport[j].y[3],Airport[j].y[1]) )//说明 1是直角顶点 Airport[j].x[4]=Airport[j].x[2]+Airport[j].x[3]-Airport[j].x[1], Airport[j].y[4]=Airport[j].y[2]+Airport[j].y[3]-Airport[j].y[1]; calc_roadcost(j);//计算机场之间的铁路费用 } calc_fly_cost();//计算机场之间的航线费用 ANS=inf; for(int i=1;i<=4;i++){ int from=4*(S-1)+i; SPFA(from); } printf("%.2f",ANS); return 0; }
相关文章推荐
- IOS 从当前页面直接跳转到首页建议用pop方法
- Java异步事件:轮询与中断
- 初学者如何查阅自然语言处理(NLP)领域学术资料
- Linux下mysql的基本操作
- 快速替换dll命名空间 z
- 用mysqldump --master-data 建立slave
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- css知多少(8)——float上篇
- win32 线程知识点梳理三
- Trailing Zeroes (III)(lightoj 二分好题)
- LintCode--best-time-to-buy-and-sell-stock(买卖股票的最佳时机)
- 国内外自然语言处理(NLP)研究组
- LeetCode -- Ugly Number II
- 开博第一篇...
- HDU 5459 Jesus Is Here(DP)
- 新手上路 Python **.py SyntaxError: invalid syntax未知语法错误
- AC自动机模版
- LINUX 下 tomcat的安装和配置
- Swift中创建单例的方法
- Android组件事件监听大全