思路:採用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的連雙向邊,自認為寫了很多最短路卻不知道怎麼記錄最短路的路徑。在鬆弛裡記錄就好了,每次鬆弛都記錄被鬆弛點的前驅,這樣當乙個點多次鬆弛的時候,就可以多次更新它的前驅,當它無法鬆弛時就是最短路徑上的點,也就是記錄下來的最後一次鬆弛的前驅。然後從終點開始遍歷前驅,存在...