标签:int gym101124 t2 xx t1 yy ++ dijkstra Subway
https://codeforces.com/gym/101124
题意:
最短路
思路:
建完图,上dijkstra板子即可
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N = 210;
double g[N][N]; //存储每条边
double dist[N];
bool st[N];
double dijkstra(int n)
{ //求1号点到n号点的最短路,如果不存在则返回-1
fill(dist, dist+n+5, 1e9);
dist[1] = 0;
for(int i = 0; i < n - 1; i++)
{
int t = -1;
for(int j = 1; j <= n; j++)
if(!st[j] && (t == -1 || dist[t] > dist[j]))
t = j;
for(int j = 1; j <= n; j++)
dist[j] = min(dist[j], dist[t] + g[t][j]);
st[t] = true;
}
if(dist[n] == 0x3f3f3f3f) return -1;
return dist[n];
}
pair<double, double> p[N]; int n;
double wwalk(pair<double, double> t1, pair<double, double> t2)
{return sqrt((t1.x-t2.x)*(t1.x-t2.x)+(t1.y-t2.y)*(t1.y-t2.y))/(10/3.6); }
double wsubway(pair<double, double> t1, pair<double, double> t2)
{return sqrt((t1.x-t2.x)*(t1.x-t2.x)+(t1.y-t2.y)*(t1.y-t2.y))/(40/3.6); }
signed main()
{
int xx, yy, xf, yf; cin >> xx >> yy >> xf >> yf; p[++n] = {xx, yy};
bool flag = 0;
while(cin >> xx >> yy)
{
if(xx == -1 && yy == -1) {flag = 0; continue; }
p[++n] = {xx, yy};
for(int i = 1; i < n; i++)
g[i][n] = g[n][i] = wwalk(p[i], p[n]);
if(flag)
g[n-1][n] = g[n][n-1] = wsubway(p[n-1], p[n]);
flag = 1;
}
p[++n] = {xf, yf};
for(int i = 1; i < n; i++)
g[i][n] = g[n][i] = wwalk(p[i], p[n]);
cout << fixed << setprecision(0) << dijkstra(n)/60;
return 0;
}
标签:int,gym101124,t2,xx,t1,yy,++,dijkstra,Subway 来源: https://www.cnblogs.com/wushansinger/p/15441210.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。