本题链接:点击打开链接
本题大意:
输入n,m;代表有n个点。m条边。然后输入边权值及两个顶点。再输入起点和终点。求从起点到终点的最短路程,若不存在,输出-1。
解题思路:
主要的球最短路问题,使用SPFA算法从起点開始依次进行查找就可以。详细请參考代码:
#include<stdio.h> #include<string.h> #include<queue> #define MAXN 220 #define MAXM 1010 #define INF 0x3f3f3f3f using namespace std; int head[MAXN]; int mark[MAXN]; int dis[MAXN]; struct node{ int from,to,val,next; }; node edge[MAXM]; int n,m,num; void getmap(int u,int v,int w) { node e={u,v,w,head[u]}; edge[num]=e; head[u]=num++; } void SPFA(int s) { queue<int>q; memset(mark,0,sizeof(mark)); memset(dis,INF,sizeof(dis)); q.push(s); mark[s]=1; dis[s]=0; while(!q.empty()) { int top=q.front(); q.pop(); mark[top]=0; for(int i=head[top];i!=-1;i=edge[i].next) { int u=edge[i].to; if(dis[u]>dis[top]+edge[i].val) { dis[u]=dis[top]+edge[i].val; if(!mark[u]) { mark[u]=1; q.push(u); } } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(head,-1,sizeof(head)); num=0; for(int i=0;i<m;i++) { int a,b,d; scanf("%d%d%d",&a,&b,&d); getmap(a,b,d); getmap(b,a,d); } int s,e; scanf("%d%d",&s,&e); SPFA(s); if(dis[e]==INF) printf("-1 "); else printf("%d ",dis[e]); } return 0; }