日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

系兄弟就来砍我 有向图单源最短路

發(fā)布時(shí)間:2024/10/6 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 系兄弟就来砍我 有向图单源最短路 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

系兄弟就來砍我

時(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。