标签:sample 最短路 inpu 操作 例题 html 记录 oid int
利用SPFA算法来解决hdu1874
首先了解一下SPFA的相关概念:https://baike.so.com/doc/6843451-7060772.html
SPFA可以处理负权边
若给定的图存在负权边,类似Dijkstra算法等算法便没有了用武之地,SPFA算法便派上用场了。简洁起见,我们约定加权有向图G不存在负权回路,即最短路径一定存在。用数组d记录每个结点的最短路径估计值,而且用邻接表来存储图G。我们采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。
例题hdu1874:
题意
Input本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。Output对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
Sample Input
3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
Sample Output
2 -1
#include<cstdio> #include<queue> using namespace std; const int INF=1000000; const int MAXN=200+10; int n,m; int map[MAXN][MAXN]; int dis[MAXN]; void SPFA(int s) { for(int i=0;i<n;i++) dis[i]=INF; bool vis[MAXN]={0}; vis[s]=true; dis[s]=0; queue<int> q; q.push(s); while(!q.empty()) { int cur=q.front(); q.pop(); vis[cur]=false; for(int i=0;i<n;i++) { if(dis[cur] + map[cur][i] < dis[i]) { dis[i]=dis[cur] + map[cur][i]; if(!vis[i]) { q.push(i); vis[i]=true; } } } } } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) map[i][j]=INF; for(int i=0;i<m;i++) { int from,to,dis; scanf("%d%d%d",&from,&to,&dis); if(map[from][to]>dis) map[from][to]=map[to][from]=dis; } int s,t; scanf("%d%d",&s,&t); SPFA(s); if(dis[t]==INF) puts("-1"); else printf("%d\n",dis[t]); } return 0; }
标签:sample 最短路 inpu 操作 例题 html 记录 oid int
原文地址:https://www.cnblogs.com/LJHAHA/p/11231515.html