系兄弟就来砍我 有向图单源最短路
系兄弟就來砍我
時(shí)間限制:?1 Sec??內(nèi)存限制:?128 MB
題目描述
渣渣灰因?yàn)橐痪洹按蠹液?#xff0c;我系渣渣輝,系兄弟就來砍我”引得眾粉絲紛紛拿兩米長的大刀尋找。
現(xiàn)有n個(gè)據(jù)點(diǎn),編號(1~n),有m條單向路使據(jù)點(diǎn)相連。每個(gè)據(jù)點(diǎn)僅有一個(gè)人。
這n個(gè)人中有k個(gè)粉絲。其中渣渣灰在s據(jù)點(diǎn)處。請問這k個(gè)粉絲到渣渣灰的最短距離是多少
輸入
首行輸入nmks。(k<=n<=100m<=500)s為渣渣灰所在位置
接下來m行,每行輸入x,y,z,表示從x到y(tǒng)的距離是z,由于是單向邊,則y到x的距離不一定是z。
接下來k個(gè)數(shù)字,表示粉絲所在據(jù)點(diǎn)。
輸出
對于每一個(gè)粉絲,輸出對應(yīng)的最短距離。
樣例輸入
3 3 2 1 1 2 1 2 3 1 3 1 1 2 3樣例輸出
2 1提示
數(shù)據(jù)保證k個(gè)粉絲均能到達(dá)渣渣灰的據(jù)點(diǎn)
分析:
Dijkstra算法求單源最短路裸題,因?yàn)橐髃個(gè)粉絲(起點(diǎn))到?S 終點(diǎn)的最短距離,如果正向建邊,求k次最短路會超時(shí)
所以考慮逆向建邊,求S點(diǎn)到所有點(diǎn)的最短距離,儲存在dis數(shù)組中
既然要求k個(gè)點(diǎn)到s點(diǎn)的最短路,我們可以反過來求s到這k個(gè)點(diǎn)的最短路。這樣就變成了單源最短路問題,dijkstra算法和spfa算法都可以做。由于圖為有向圖,我們在存圖時(shí)反向存圖即可,原本a[i][j]表示i->j,我們可以將它重新定義為j->i,或者存圖時(shí)直接寫成a[j][i]即可。
#include<bits/stdc++.h> using namespace std; const int maxn = 107; const int inf = 0x3f3f3f3f; //需將road及dis初始化為正無窮inf int n,m,k,s; int dis[maxn]; //儲存各個(gè)點(diǎn)到源點(diǎn)的最短距離,dis[s]為0 int road[maxn][maxn]; //兩點(diǎn)之間直接距離關(guān)系 bool vis[maxn]; //判斷源點(diǎn)到該點(diǎn)的距離是否為最短距離 int fans[maxn]; //粉絲 void dijkstra(int s) {memset(vis, false, sizeof(vis));//標(biāo)記是否求出最短路徑vis[s] = true;//標(biāo)記起點(diǎn)到這一點(diǎn)的最小距離已經(jīng)求出for(int i = 1; i <= n; i++)dis[i] = road[s][i];//初始化起點(diǎn)到每一個(gè)點(diǎn)的距離for(int u = 1; u<n; u++){int minD = inf,k = -1;for(int i = 1; i<= n; i++){if(!vis[i]&&dis[i]<minD){k = i;//記錄下標(biāo)minD = dis[i];//記錄最小值}}vis[k] = true;//標(biāo)記已經(jīng)訪問過//松弛操作for(int i = 1; i<= n; i++){if(!vis[i]&&dis[k]+road[k][i]<dis[i]){dis[i]=dis[k]+road[k][i];}//if}//for} } int main() {while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF){memset(road,inf,sizeof(road));for(int i=1;i<=m;i++){int a,b,d;scanf("%d%d%d",&a,&b,&d);road[b][a]=min(d,road[b][a]);//逆向建邊//起點(diǎn)是fans[i],終點(diǎn)是S}for(int i=1;i<=k;i++)scanf("%d",&fans[i]);dis[s]=0;dijkstra(s);for(int i=1;i<=k;i++){printf("%d",dis[fans[i]]);if(i==k) printf("\n");else printf(" ");}}return 0; }?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的系兄弟就来砍我 有向图单源最短路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单的一道题 背包问题
- 下一篇: 躁动的小Z 最短路+路径记录