记录编号 |
131492 |
评测结果 |
AAAAA |
题目名称 |
[省常中2011S4] 最短路径问题 |
最终得分 |
100 |
用户昵称 |
乌龙猹 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.002 s |
提交时间 |
2014-10-24 16:10:54 |
内存使用 |
0.39 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
int a[101][3];
double f[101][101];
int n,j,i,k,x,y,m,s,e;
int Pow(int x)
{
return x*x;
}
double spfa(int);
int main()
{
freopen("short.in","r",stdin);
freopen("short.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n;
for(i=1;i<=n;++i)
cin>>a[i][1]>>a[i][2];
cin>>m;
memset(f,0x7f,sizeof(f));
for(i=1;i<=m;i++)
{
cin>>x>>y;
f[y][x]=f[x][y]=sqrt(Pow((a[x][1]-a[y][1]))+Pow(a[x][2]-a[y][2]));
}
cin>>s>>e;
printf("%.2f",spfa(s));
return 0;
}
double spfa(int x)
{
double dis[101];
memset(dis,0x7f,sizeof(dis));
dis[x]=0;
queue<int> q;
bool flag[101]={0};
q.push(x);
flag[x]=1;
while(!q.empty())
{
int k=q.front();
for(int i=1;i<=n;i++)
{
if(dis[i]>dis[k]+f[k][i])
{
dis[i]=dis[k]+f[k][i];
if(!flag[i])
{
flag[i]=1;
q.push(i);
}
}
}
flag[k]=0;
q.pop();
}
return dis[e];
}