hdu 2544 最短路(SPFA算法)
阿新 • • 發佈:2017-05-21
oid rom 表示 max 兩個 amp 取消 get pid
本題鏈接:點擊打開鏈接
本題大意:
首先輸入一個n,m。代表有n個點。m條邊。然後輸入m條邊,每條邊輸入兩個點及邊權。1為起點,n為終點。輸入兩個零表示結束。
解題思路:
本題能夠使用SPFA算法來做。此算法與dijkstra算法的差別在於,此算法能夠計算邊權為負值的情況。使用此算法首先須要用鄰接表建圖,用dis數組存放當前點距起點的最短權值之和。用mark數組標記已使用過的點。SPFA算法過程與廣度優先搜索相似,此代碼與BFS的差別在於已經標記的點。在再次取出來的時候要取消標記。
本題AC代碼例如以下:
#include<stdio.h> #include<string.h> #include<queue> #define MAXN 110 #define MAXM 20200 #define INF 0x3f3f3f3f using namespace std; int head[MAXN]; int mark[MAXN]; int dis[MAXN]; int num; struct node{ int from; int to; int val; int next; }; node edge[MAXM]; 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) { memset(mark,0,sizeof(mark)); memset(dis,INF,sizeof(dis)); queue<int>q; q.push(s); dis[s]=0; mark[s]=1; 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() { int n,m; while(scanf("%d%d",&n,&m),n||m) { 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); } SPFA(1); printf("%d\n",dis[n]); } return 0; }
hdu 2544 最短路(SPFA算法)