[NOIP2001]Car的旅行路线
題目描述 Description
又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每個城市都有四個飛機場,分別位于一個矩形的四個頂點上,同一個城市中兩 個機場之間有一條筆直的高速鐵路,第I個城市中高速鐵路了的單位里程價格為Ti,任意兩個不同城市的機場之間均有航線,所有航線單位里程的價格均為t。
那么Car應如何安排到城市B的路線才能盡可能的節省花費呢?她發現這并不是一個簡單的問題,于是她來向你請教。
任務
找出一條從城市A到B的旅游路線,出發和到達城市中的機場可以任意選取,要求總的花費最少。
輸入描述 Input Description
第一行為一個正整數n(0<=n<=10),表示有n組測試數據。
每組的第一行有四個正整數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 Description
共有n行,每行一個數據對應測試數據。
樣例輸入 Sample Input
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
樣例輸出 Sample Output
47.5
分析
最短路的裸題= = 唯一存在的問題就是如何把“四源四終點”的最短路問題轉化為復雜度較低的問題。借用劉汝佳《訓練指南》上網絡流建模的思路,這里不妨建立一個虛擬機場0,在0和城市A的四個機場各連一條權值為0的邊,即可用單源最短路算法求解。另。。因為題目中邊數E很接近n2,所以用Dijkstra會比SPFA快很多(2s和4s)。。。。別看我,我是寫完SPFA之后才想起來的=_=||
?
?1?//Awsm.Definer?→_→?2?//E-Mail:?willywu1998@foxmail.com
?3?#include?<cstdio>
?4?#include?<deque>
?5?#include?<cmath>
?6?#include?<memory.h>
?7?#include?<iostream>
?8?#define?MAX?0x3f3f3f3f
?9?#define?mod(x)?(?sqrt((x)?*?(x))?)
10?using?namespace?std;
11?struct?v?{?//vector(location)
12?????int?x,y;
13?????v?(){};v(int?a,int?b):x(a),y(b){};
14?????v?operator?+(const?v&?b)?{return?v(x+b.x,y+b.y);}
15?????v?operator?-(const?v&?b)?{return?v(x-b.x,y-b.y);}
16?????int?operator?*?(const?v&?b)?{return?x*b.x?+?y*b.y;}
17?};
18?inline?v?get4(v?&p1,v?&p2,v?&p3)?{
19?????if((p2?-?p1)?*?(p3?-?p1)?==?0)?return?p2?-?p1?+?p3;
20?????if((p1?-?p2)?*?(p3?-?p2)?==?0)?return?p1?-?p2?+?p3;
21?????return?p1?-?p3?+?p2;
22?}
23?inline?void?getv(v?&k)?{
24?????scanf("%d%d",&k.x,&k.y);
25?}
26?int?n,s,t,A,B;?//the?meaning?of?s will be changed in function "work"...
27?double?dis[404][404]={0};
28?inline?void?makegragh()?{?//build?dis[][]
29?????v?p[404];
30?????int?Ti;
31?????for(int?i=1;i<=s;i+=4)?{
32?????????getv(p[i]),getv(p[i+1]),getv(p[i+2]);scanf("%d",&Ti);
33?????????p[i+3]=get4(p[i],p[i+1],p[i+2]);
34?????????for(int?j=0;j<3;++j)for(int?k=j;k<4;++k)
35?????????????dis[i+j][i+k]=dis[i+k][i+j]=Ti?*?mod((p[i+k]-p[i+j]));
36?????????for(int?j=1;j<i;++j)for(int?k=0;k<4;++k)
37?????????????dis[j][i+k]=dis[i+k][j]=t?*?mod((p[i+k]-p[j]));
38?????}
39?}
40?inline?double?SPFA()?{?
41?????deque?<int>?Q;
42?????int?k?=?4?*?A?-?3,K?=?4?*?B?-?3;
43?????Q.push_front(k),Q.push_front(k+1),Q.push_front(k+2),Q.push_front(k+3);
44?????bool?in_Q[404]?=?{0};in_Q[k]=in_Q[k+1]=in_Q[k+2]=in_Q[k+3]=1;
45?????double?cost[404];
46?????int?i,t;
47?????for(i=1;i<=s;++i)?cost[i]?=?MAX;
48?????cost[k]=cost[k+1]=cost[k+2]=cost[k+3]=0;
49?????while(!Q.empty())?{
50?????????t?=?Q.front();?Q.pop_front();?in_Q[t]?=?0;
51?????????for(i?=?1;i?<=?s;++i)?{
52?????????????if(i==t)continue;
53?????????????if(cost[i]?>?cost[t]?+?dis[i][t])?{?//relax
54?????????????????cost[i]?=?cost[t]?+?dis[i][t];
55?????????????????if(in_Q[i])continue;
56?????????????????if(Q.empty()?||?cost[Q.front()]?<?cost[i])Q.push_back(i);
57?????????????????else?Q.push_front(i);
58?????????????????in_Q[i]?=?1;
59?????????????}
60?????????}
61?????}
62?????return?min(min(cost[K],cost[K+1]),min(cost[K+2],cost[K+3]));
63?}
64?void?work()?{
65?????scanf("%d%d%d%d",&s,&t,&A,&B);s?*=?4;//s?->?sum?of?airports
66?????makegragh();
67?????printf("%.1f\n", SPFA());?//(0)?->?(4*n+1)
68?}
69?int?main(){
70?????#ifdef?DEBUG
71?????freopen("test.in","r",stdin);
72?????#endif
73?????scanf("%d",&n);
74?????while(n--)
75?????????work();
76?????return?0;
77?}
轉載于:https://www.cnblogs.com/Asm-Definer/p/3912640.html
總結
以上是生活随笔為你收集整理的[NOIP2001]Car的旅行路线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【工作总结】C++ string工具类
- 下一篇: 修改wamp默认网站目录