又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。
那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
任务
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。
第一行为一个正整数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个城市高速铁路单位里程的价格。
共有n行,每行一个数据对应测试数据。
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.5
如描述
分类标签 Tags 点此展开
#include<cstdio> #include<iostream> #include<cmath> using namespace std; #define N 110 struct node{ int x,y,id; node(int x=0,int y=0,int id=0):x(x),y(y),id(id){} }e[N*4]; double g[N][N]; int n,fly,T,a,b,car[N]; double dis(int p,int q){ //return sqrt((double)(f(e[p].x-e[q].x)+f(e[p].y-e[q].y)));//sqrt不支持多重运算 int xx=e[p].x-e[q].x; int yy=e[p].y-e[q].y; return sqrt(xx*xx+yy*yy); } double dis1(int p,int q){ int xx=e[p].x-e[q].x; int yy=e[p].y-e[q].y; return xx*xx+yy*yy; } node cal(int k1,int k2,int k3,int id)//处理第四个点,因为第四个点的位置不一定在哪里--要枚举下 { double d12=dis1(k1,k2),d13=dis1(k1,k3),d23=dis1(k2,k3); if(d12==d13+d23){ int dx=e[k3].x-e[k1].x; int dy=e[k3].y-e[k1].y; return node(e[k2].x-dx,e[k2].y-dy,id); } if(d23==d12+d13){ int dx=e[k1].x-e[k2].x; int dy=e[k1].y-e[k2].y; return node(e[k3].x-dx,e[k3].y-dy,id); } int dx=e[k2].x-e[k1].x; int dy=e[k2].y-e[k1].y; return node(e[k3].x-dx,e[k3].y-dy,id); } int main(){ scanf("%d",&T); while(T--){ scanf("%d%d%d%d",&n,&fly,&a,&b); for(int i=1;i<=n;i++){ int k1=(i-1)*4+1,k2=k1+1,k3=k1+2,k4=k1+3; scanf("%d%d%d%d%d%d%d",&e[k1].x,&e[k1].y,&e[k2].x,&e[k2].y,&e[k3].x,&e[k3].y,&car[i]); e[k1].id=e[k2].id=e[k3].id=i; e[k4]=cal(k1,k2,k3,i); } for(int i=1;i<=4*n;i++){ for(int j=1;j<=4*n;j++){ g[i][j]=1e6; } } for(int i=1;i<=4*n;i++){ for(int j=1;j<=4*n;j++){ if(e[i].id==e[j].id){ g[i][j]=min(g[i][j],dis(i,j)*car[e[i].id]); } else{ g[i][j]=min(g[i][j],dis(i,j)*fly); } } } for(int i=1;i<=4*n;i++) g[i][i]=0; for(int k=1;k<=4*n;k++){ for(int i=1;i<=4*n;i++){ for(int j=1;j<=4*n;j++){ if(i!=j&&i!=k&&j!=k){ g[i][j]=min(g[i][j],g[i][k]+g[k][j]); } } } } double ans=0x3f3f3f3f; for(int i=a*4-3;i<=a*4;i++){ for(int j=b*4-3;j<=b*4;j++){ ans=min(ans,g[i][j]); } } printf("%.1lf ",ans); } return 0; }
小松所在的PK大学校园又称作燕园,是一个十分美丽的校园。有博雅塔,未名湖,亚洲最大的高校图书馆,人称“一塔湖图”。但是由于燕园的历史比较悠久,所以很多的老房子都要不断地维修(就像故宫现在在维修一样),这导致了燕园中的一些路是禁止通行的。
十分有趣的是,整个燕园的形状是南北朝向的一个四边形,而燕园的建筑格局也十分有规则。你可以假设他被n条横向的路和m条纵向的路分割成了大大小小的很多块区域。禁止通行的那些路正好在两个相邻的交叉路口之间。小松十分想知道,他要从他宿舍所在的A路口到达图书馆所在的B路口需要多少时间(他只能沿着能够通行的道路行走,并假设小松走1单位长度需要1单位的时间)?你能帮助他吗?(不要误会小松如此勤奋要去图书馆看书,小松去图书馆的主要原因是那里是全校PPMM最多的地方)。
另外要说的是,燕园中还有很多的地方是湖。所以湖所占的区域也是不能通行的。
输入文件的第一行包含4个整数n(1≤n≤10),m(1≤m≤10),t(1≤t≤100),k(1≤k≤10)。分别表示燕园中有n条纵向的路和m条横向的路,t条不能通行的路,还有k个湖。接下来的一行有n个整数a1..an。ai(0≤ai≤100)表示从西往东第i条纵向向路离燕园最西端的距离;再接下来的一行有m个整数b1..bm。bi(0≤bi≤100)表示从南往北第i条横向路离燕园最南端的距离;再接下来k行,每行四个整数x1,x2,y1,y2表示由西向东的第x1条路到第x2条路和由南向北的第y1条路到第y2条路之间是一个湖。要注意的是湖的边缘是可以行走的,湖也可能有重叠,如果两个湖接壤的话,接壤的部分也是可以行走的;再接下来t行,每行4个整数x1,y1,x2,y2,表示路口(x1,y1)和(x2,y2)之间的路是静止通行的,你可以认定该两个路口一定是相邻的;最后一行包含4个整数x1,y1,x2,y2,表示小松所在的路口A(x1,y1)和图书馆所在的路口B(x2,y2)。
注:路口(x,y)表示由西向东的第x条纵向路和由南向北的第y条横向路的交叉口。
输出包括一个整数,表示小松最少需要花费的时间。保证不会出现无解的情况。
4 4 2 1
0 1 3 4
0 1 3 4
2 4 2 4
2 2 3 2
2 4 3 4
1 3 4 4
11
#include<iostream> #include<cstdio> using namespace std; #define inf 1e6 int x[10],y[10]; int n,m,t,k,x1,y1,x2,y2; int a,b; int f[120][120]; int main() { cin>>n>>m>>t>>k; for(int i=1;i<=n;i++)cin>>x[i]; for(int i=1;i<=m;i++)cin>>y[i]; for(int i=1;i<=n*m;i++) for(int j=1;j<=n*m;j++){ if(i==j)f[i][j]=0; else f[i][j]=inf; } for(int i=1;i<=n;i++)//又是离散化 for(int j=1;j<=m;j++){ if(i>1) f[(j-1)*n+i][(j-1)*n+i-1]=x[i]-x[i-1]; if(j>1) f[(j-1)*n+i][(j-2)*n+i]=y[j]-y[j-1]; if(i<n) f[(j-1)*n+i][(j-1)*n+i+1]=x[i+1]-x[i]; if(j<m) f[(j-1)*n+i][j*n+i]=y[j+1]-y[j]; } for(int i=1;i<=t;i++){ cin>>x1>>y1>>x2>>y2; f[(y1-1)*n+x1][(y2-1)*n+x2]=inf; f[(y2-1)*n+x2][(y1-1)*n+x1]=inf; } for(int i=1;i<=k;i++){ cin>>x1>>x2>>y1>>y2; for( a=x1;a<=x2-1;a++) for( b=y1+1;b<=y2-1;b++){ f[(b-1)*n+a][(b-1)*n+a+1]=inf; f[(b-1)*n+a+1][(b-1)*n+a]=inf; } for( b=y1;b<=y2-1;b++) for( a=x1+1;a<=x2-1;a++){ f[(b-1)*n+a][b*n+a]=inf; f[b*n+a][(b-1)*n+a]=inf; } } for(int k=1;k<=n*m;k++) for(int i=1;i<=n*m;i++) for(int j=1;j<=n*m;j++) f[i][j]=min(f[i][k]+f[k][j],f[i][j]); cin>>x1>>y1>>x2>>y2; cout<<f[(y1-1)*n+x1][(y2-1)*n+x2]; return 0; }