题目描述
小P一觉醒来发现天已经亮了。今天是程序设计大赛的日子,小P需要尽快赶往考场。 小P家在a号路口,他会告诉你哪些路口是相联通的,距离是多少。赛场在b号路口,该市道路没有单行道。 小P想让你帮他规划到考场的路线,他希望找到这条最短的路线以用最短时间抵达考场。
输入
第一行四个整数n,m,a,b (1<=n<=2500 ,1<=m<=6200 ,1<=a,b<=n ) ,n表示有n个路口,m表示有m条路,每两个路口之间连通算一条路,接下来m行,每行三个数,x,y,c代表x路口到y路口之间有一条路距离为c
输出
一个数,小P家到比赛现场的距离。
样例输入 Copy
7 11 5 4 2 4 2 1 4 3 7 2 2 3 4 3 5 7 5 7 3 3 6 1 1 6 3 4 2 4 3 5 6 3 7 2 1样例输出 Copy
7提示
1<=n<=2500
1<=m<=6200
1<=a,b<=n
一道求a到b的最短路模板(单源),我用的SPFA。
注意这个题有重边,用链式前向星建图不需要考虑重边的问题。
注意无向图,建双向边
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+100; int n,m,a,b; struct node { int v,w; int next; }edge[maxn]; int head[maxn]; int dis[maxn]; int tot; void init() { tot=0; memset(head,-1,sizeof(head)); } void addedge(int u,int v,int w) { edge[tot].v=v; edge[tot].w=w; edge[tot].next=head[u]; head[u]=tot++; edge[tot].v=u; edge[tot].w=w; edge[tot].next=head[v]; head[v]=tot++; } void spfa(int st) { memset(dis,0x3f,sizeof(dis)); queue<int>q; dis[st]=0; q.push(st); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; int w=edge[i].w; if(dis[v]>dis[u]+w) { dis[v]=dis[u]+w; q.push(v); } } } } int main() { //freopen("C://input.txt","r",stdin); cin >> n >> m >> a >> b; init(); for(int i=0;i<m;i++) { int x,y,z; cin >> x >> y >> z; addedge(x,y,z); } spfa(a); printf("%d\n",dis[b]); } /************************************************************** Problem: 1524 User: 1610101013 Language: C++ Result: 正确 Time:12 ms Memory:3604 kb ****************************************************************/