演算法作業 (最短路 記錄全部路徑)

2021-08-30 13:38:55 字數 1293 閱讀 9983

思路:採用n*logn的優化迪傑斯特拉演算法,求出最短路,反向建圖以後,在dfs搜尋即可,用set+vector記錄路徑,注意vector的傳遞需要加引用(用string 就不用加引用)。

實現非常簡單,直接看**就行。

#include using namespace std;

const int maxn=100;

typedef long long ll;

struct edge

edge[maxn<<1],edge2[maxn<<1];

int head[maxn];

int num;

void addedge(int u,int v,int w)

int num2,head2[maxn];

void addedge2(int u,int v,int w)

void init()

struct node

bool operator <(const node &tmp) const

node()=default;

};int n,s,t;

bool vis[maxn];

int dis[maxn];

int path[maxn];

void dijkstra(int st) //起點}}

}set> se;

void prinpath(int s,vector&vec)

for(int i=head2[s];i!=-1;i=edge2[i].next) }

// reverse(vec.begin(),vec.end());

// se.insert(vec);

}int main()

}scanf("%d%d",&s,&t);

dijkstra(s);

printf("case %d\n",++case);

printf("the least distance from %d -> %d is %d\n",s,t,dis[t]);

vectorvec;

prinpath(t,vec);

set>::iterator it;

printf("最短路徑有:%d 條\n",se.size());

printf("the path is ");

for(it=se.begin();it!=se.end();it++)

printf("%d\n",ans[ans.size()-1]);

cout<} }

return 0;

}

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

Dijkstra演算法,並記錄最短路徑

看 時需要提前理解的 我們用乙個一維陣列怎麼儲存起點到其餘所有點的多條最短路徑 我們只需要記錄起點s到某個節點n的最短路徑的最後乙個中間節點k 找到k後在找到s到k的最短路徑的最後乙個中間節點l,如此反覆就可以找到路徑 所以一條路徑只要記錄乙個點,乙個一維陣列就可以搞定了 include inclu...

歐濤最短路 記錄最短路徑

就是普通的最短路,建圖時點的距離小於m的連雙向邊,自認為寫了很多最短路卻不知道怎麼記錄最短路的路徑。在鬆弛裡記錄就好了,每次鬆弛都記錄被鬆弛點的前驅,這樣當乙個點多次鬆弛的時候,就可以多次更新它的前驅,當它無法鬆弛時就是最短路徑上的點,也就是記錄下來的最後一次鬆弛的前驅。然後從終點開始遍歷前驅,存在...