题目描述
中山路店山店海,成了购物狂爱与愁大神的“不归之路”。中山路上有n(n<=100)家店,每家店的坐标均在-10000~10000之间。其中的m家店之间有通路。若有通路,则表示可以从一家店走到另一家店,通路的距离为两点间的直线距离。现在爱与愁大神要找出从一家店到另一家店之间的最短距离。你能帮爱与愁大神算出吗?
输入输出格式
输入格式:
共n+m+3行:
第1行:整数n
第2行~第n+1行:每行两个整数x和y,描述了一家店的坐标
第n+2行:整数m
第n+3行~第n+m+2行:每行描述一条通路,由两个整数i和j组成,表示第i家店和第j家店之间有通路。
第n+m+3行:两个整数s和t,分别表示原点和目标店
输出格式:
仅一行:一个实数(保留两位小数),表示从s到t的最短路径长度。
输入输出样例
说明
100%数据:n<=100,m<=1000
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define inf 2147483647 const ll INF = 0x3f3f3f3f3f3f3f3fll; #define ri register int template <class T> inline T min(T a, T b, T c) { return min(min(a, b), c); } template <class T> inline T max(T a, T b, T c) { return max(max(a, b), c); } template <class T> inline T min(T a, T b, T c, T d) { return min(min(a, b), min(c, d)); } template <class T> inline T max(T a, T b, T c, T d) { return max(max(a, b), max(c, d)); } #define pi acos(-1) #define me(x, y) memset(x, y, sizeof(x)); #define For(i, a, b) for (int i = a; i <= b; i++) #define FFor(i, a, b) for (int i = a; i >= b; i--) #define mp make_pair #define pb push_back const int maxn = 100005; #define mod 100003 const int N=10000; // name******************************* int n,m; struct node { int x,y; } p[1005]; struct edge { int to,next; double w; } e[N]; int Head[N]; int tot=0; int ss,tt; int vis[N]; double dis[N]; queue<int>que; // function****************************** double dist(node a,node b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } void add(int u,int v,double w) { e[++tot].to=v; e[tot].next=Head[u]; Head[u]=tot; e[tot].w=w; } void spfa(int u) { que.push(u); vis[u]=1; dis[u]=0; while(!que.empty()) { int u=que.front(); que.pop(); vis[u]=0; for(int p=Head[u]; p; p=e[p].next) { int v=e[p].to; double w=e[p].w; if(dis[v]>dis[u]+w) { dis[v]=dis[u]+w; if(!vis[v]) { vis[v]=1; que.push(v); } } } } } //*************************************** int main() { // freopen("test.txt", "r", stdin); cin>>n; For(i,1,n) scanf("%d%d",&p[i].x,&p[i].y); cin>>m; For(i,1,m) { int a,b; scanf("%d%d",&a,&b); double c=dist(p[a],p[b]); add(a,b,c); add(b,a,c); } cin>>ss>>tt; For(i,1,n) dis[i]=inf; spfa(ss); printf("%.2f",dis[tt]); return 0; }