cogs 1075. [省常中2011S4] 最短路径问题
★ 输入文件:short.in
输出文件:short.out
简单对比
时间限制:1 s
内存限制:128 MB
[问题描述]
平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。
[输入格式]
输入文件为short.in,共n+m+3行,其中:
第一行为整数n。
第2行到第n+1行(共n行),每行两个整数x和y,描述了一个点的坐标。
第n+2行为一个整数m,表示图中连线的个数。
此后的m行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线。
最后一行:两个整数s和t,分别表示源点和目标点。
[输出格式]
输出文件为short.out,仅一行,一个实数(保留两位小数),表示从s到t的最短路径长度。
[样例输入]
5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
[样例输出]
3.41
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<queue> 6 7 using namespace std; 8 const int N=1001; 9 const int maxn=999999; 10 11 int head[N]; 12 double dis[N]; 13 int vis[N]; 14 int now=1; 15 queue<int>q; 16 int m; 17 int n; 18 int s; 19 int e; 20 21 struct node{ 22 double x,y; 23 }D[N]; 24 25 struct NODE{ 26 int u,v,nxt; 27 double w; 28 }E[N*10]; 29 30 inline void read(int &x) 31 { 32 char c=getchar(); 33 x=0; 34 while(c<'0'||c>'9')c=getchar(); 35 while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); 36 } 37 38 inline double j(int u,int v) 39 { 40 return sqrt(pow(abs(D[u].x-D[v].x),2)+pow(abs(D[u].y-D[v].y),2)); 41 } 42 43 inline void add(int u,int v,double w) 44 { 45 E[now].u=u; 46 E[now].v=v; 47 E[now].w=w; 48 E[now].nxt=head[u]; 49 head[u]=now; 50 now++; 51 } 52 53 inline void spfa(int s) 54 { 55 for(int i=1;i<=n;i++) 56 dis[i]=maxn; 57 dis[s]=0; 58 vis[s]=1; 59 q.push(s); 60 while(!q.empty()) 61 { 62 int top=q.front(); 63 q.pop(); 64 vis[top]=0; 65 for(int i=head[top];i!=-1;i=E[i].nxt) 66 { 67 int v=E[i].v; 68 double w=E[i].w; 69 if(dis[v]>dis[top]+w) 70 { 71 dis[v]=dis[top]+w; 72 if(!vis[v]) 73 { 74 vis[v]=1; 75 q.push(v); 76 } 77 } 78 } 79 } 80 printf("%.2lf",dis[e]); 81 return ; 82 } 83 84 int main() 85 { 86 freopen("short.in","r",stdin); 87 freopen("short.out","w",stdout); 88 read(n); 89 90 for(int i=1;i<=n;i++) 91 { 92 scanf("%lf%lf",&D[i].x,&D[i].y); 93 head[i]=-1; 94 } 95 read(m); 96 for(int i=1;i<=m;i++) 97 { 98 int u,v; 99 read(u); 100 read(v); 101 double jl=j(u,v); 102 add(u,v,jl); 103 add(v,u,jl); 104 } 105 106 read(s);read(e); 107 spfa(s); 108 109 return 0; 110 111 }