您的位置:首页 > 其它

poj 2502 Subway dijkstra基础 !!!!入门题

2011-11-22 17:13 239 查看
这是我第一个dijkstra,之前接触过,但不知道这个算法,现在一看,还是不难的,关键就是不断更新d[]数组,使d[]数组里面放的一直是
所有点到起点的最小值,还有vis[]数组来避免重复查找!!!!!!!!!!
#include<iostream>
using namespace std;
#include<algorithm>
#include<math.h>
struct node
{
double x;
double y;
}a[205];
int vis[205];
double d[205];
double map[205][205];
int main()
{
while(cin>>a[0].x>>a[0].y>>a[1].x>>a[1].y)
{
memset(map,0.0,sizeof(map));
int n=2;
int sign=0;
while(scanf("%lf%lf",&a
.x,&a
.y)!=EOF)
{
if(a
.x==-1&&a
.y==-1)
{
sign=0; //这个sign很有用,我已开始把输入方式看错了,一行的第一站和上一行的最后一站不是联通的
continue;
}
if(sign==1)
map
[n-1]=map[n-1]
=(sqrt((a
.x-a[n-1].x)*(a
.x-a[n-1].x)+(a
.y-a[n-1].y)*(a
.y-a[n-1].y)))/40000.0 ;
n++;
sign=1;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j]==0)
{
map[i][j]=map[j][i]=(sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)))/10000.0;
if(i==j)
map[i][j]=10000000.0;
}
}
}//以下就是dijkstra的过程了
memset(vis,0,sizeof(vis));
vis[0]=1;
for(int i=0;i<n;i++)
d[i]=map[0][i];
//			for(int i=0;i<n;i++)
//			cout<<d[i]<<' ';
//			system("pause");
double max=10000000.0;
for(int i=1;i<n;i++)
{
double temp=max;
int u;
for(int j=1;j<n;j++)
if(!vis[j]&&d[j]<temp)
{
temp=d[j];
u=j;
}
vis[u]=1;
for(int j=0;j<n;j++)
{
if(!vis[j])
if(d[j]>map[u][j]+d[u])
d[j]=map[u][j]+d[u];
}
}
double ans=60.0*d[1];
printf("%0.lf\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: