關於spfa的初步探究

來源:互聯網
上載者:User
/*對於菜鳥,第一次接觸這種大型演算法,應該抽出一大段時間研究,研究這個演算法我認為要有DIJ和Floyd的鋪墊。搜集各路資料,大概有以下幾個要點。1.SPFA(Shortest Path Faster Algorithm)是Bellman-Ford演算法的一種隊列實現,減少了不必要的冗餘計算。(啊,親,什麼是Bellman-Ford?大致:1對每條邊進行|V|-1次Relax操作;2如果存在(u,v)∈E使得dis[u]+w<dis[v],則存在負權迴路;否則dis[v]即為s到v的最短距離,pre[v]為前驅。)2.演算法大致流程是用一個隊列來進行維護。 初始時將源排入佇列。 每次從隊列中取出一個元素,並對所有與他相鄰的點進行鬆弛,若某個相鄰的點鬆弛成功,則將其入隊。 直到隊列為空白時演算法結束(很重要啊親,對於我這樣編碼能力很渣的很重要,重要在什麼?關鍵詞"隊列""相連")。3.虛擬碼Procedure SPFA; Begin  initialize-single-source(G,s);  initialize-queue(Q);  enqueue(Q,s);  while not empty(Q) do     begin      u:=dequeue(Q);      for each v∈adj[u] do         begin          tmp:=d[v];          relax(u,v);          if (tmp<>d[v]) and (not v in Q) then            enqueue(Q,v);        end;    end;End;4.我代碼能力渣,SPFA演算法有兩個最佳化演算法 SLF 和 LLL: SLF,不會。Autor:ray007great*//*構圖有2種,鄰接矩陣版.最裸的最短路,對應hdu 2544*/#include #include #include #include #include #include #define N 150#define inf 999999using namespace std;queueq;int n;int vis[N],dis[N],map[N][N];int spfa(){int i;memset(vis,0,sizeof(vis));for(i=0;i<=n;i++)dis[i]=inf;q.push(1);vis[1]=1;dis[1]=0;while(!q.empty()){int cur=q.front();q.pop();for(i=1;i<=n;i++){if(map[cur][i]!=inf){if(dis[i]>dis[cur]+map[cur][i]){dis[i]=dis[cur]+map[cur][i];//pre[i]=cur;if(!vis[i]){vis[i]=1;q.push(i);} }}}vis[cur]=0;}return dis[n];}int main(){int i,a,b,c,j,m;while(scanf("%d%d",&n,&m)!=EOF &&n&&m){for(i=0;i<=n;i++)for(j=0;j<=n;j++)map[i][j]=inf;for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);if(map[a][b]>c) map[a][b]=map[b][a]=c;}int max=spfa(); printf("%d\n",max);}  return 0;} /*鄰接矩陣版。附:鄰接矩陣不用考慮重邊。*/#include #include #include #include #include #include #define N 150#define inf 999999using namespace std;struct node{int from,to,value;};queueq;vectorg[N];int n;int vis[N],dis[N];int spfa(){int i;memset(vis,0,sizeof(vis));for(i=0;i<=n;i++)dis[i]=inf;q.push(1);vis[1]=1;dis[1]=0;while(!q.empty()){int cur=q.front();q.pop();for(i=0;idis[cur]+g[cur][i].value){dis[k]=dis[cur]+g[cur][i].value;if(!vis[k]){vis[k]=1;q.push(k);}}}vis[cur]=0;}return dis[n];}int main(){int i,a,b,c,j,m;while(scanf("%d%d",&n,&m)!=EOF &&n&&m){for(i=0;i<N;i++) g[i].clear();for(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);node e;e.from=a;e.to=b;e.value=c;g[e.from].push_back(e);e.from=b;e.to=a;g[e.from].push_back(e);} int max=spfa(); printf("%d\n",max);}return 0;}   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.