您的位置:首页 > 其它

[kuangbin带你飞]专题四 最短路练习 L POJ 2502

2016-10-13 15:05 399 查看
题目地址:https://vjudge.net/contest/66569#problem/L

思路:基本的最短路,输入有点麻烦,每次碰到-1,-1,说明是另一条新线,以EOF结尾。然后跑一次dij即可。

AC代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
#include<cmath>
#include<map>
#define INF 0x3f3f3f3f
using namespace std;

struct pos{
int x,y;
}S[205];
double E[205][205];

double d[205];
int main()
{
int x,y;
for(int i=0;i<205;i++)
{
d[i]=INF;
for(int j=0;j<205;j++)
E[i][j]=INF;
}

scanf("%d%d",&x,&y);
S[1].x=x,S[1].y=y;
scanf("%d%d",&x,&y);
S[2].x=x,S[2].y=y;
int k=3;
int first=1;
int pre;
while(~scanf("%d%d",&x,&y))
{
if(x==-1&&y==-1)
{
first=1;
continue;
}
int now=-1;
for(int i=1;i<k;i++)
{
if(S[i].x==x && S[i].y==y)
{
now=i;
break;
}
}
if(now==-1)
{
now=k;
S[k].x=x,S[k].y=y;
k++;
}
if(first)
{
first=0;
}
else
{
double dis=sqrt((x-S[pre].x)*(x-S[pre].x)+(y-S[pre].y)*(y-S[pre].y));
dis=dis/40000;
//printf("%f\n",dis);
E[pre][now]=E[now][pre]=dis;
}
pre=now;
}
for(int i=1;i<k;i++)
for(int j=1;j<k;j++)
{
if(i==j)
continue;
double temp=sqrt((S[i].x-S[j].x)*(S[i].x-S[j].x)+(S[i].y-S[j].y)*(S[i].y-S[j].y));
//printf("%f\n",temp);
temp=temp/10000;
if(E[i][j]>temp)
{
E[i][j]=E[j][i]=temp;
}
}
priority_queue<pair<double,int> >q;
d[1]=0;
q.push(make_pair(-d[1],1));
while(!q.empty())
{
int now=q.top().second;
q.pop();
for(int i=1;i<k;i++)
{
if(i==now)
continue;
if(d[i]>d[now]+E[now][i])
{
d[i]=d[now]+E[now][i];
q.push(make_pair(-d[i],i));
}

}
}
printf("%.0f\n",d[2]*60);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: