最短路相關

2022-05-05 16:21:08 字數 2380 閱讀 2432

目錄次短路

短路\(n^3\)複雜度,資料小可以用,也可以用來判斷圖是否連通、求環。

for(int k=1;k<=n;k++)//注意中轉點在最外層列舉

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

map[i][j]=min(map[i][k]+map[k][j],map[i][j]);

廣搜求最短路,容易被卡

#include#include#includeusing namespace std;

struct nodea[500010*5];

int cnt,n,m,s,minn=0x7f,head[500010],dis[500010],exist[500010],team[500010*5],u;

void spfa()

}}int main()

spfa();

for(int i=1;i<=n;++i)

if(dis[i]==66666) cout<<2147483647<<' ';

else cout《比較靠譜的演算法。思路就是每次選距離已選點集距離最小的點加入點集

#include#includeusing namespace std;

struct edgee[500010];

int head[100010],cnt,n,m,s,dis[100010];

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

struct node

};inline void dijkstra());

while(!q.empty())

struct n

friend bool operator < (n a,n b)

};priority_queueq;

bool judge(int lim)

} if(d[n]<=k) return 1;

return 0;

}int main()

printf("%d\n",r);

ed:return 0;

}

求到每個點有多少條最短路

更新最短路的同時記錄有多少條最短路。若有更短的,則條數等於上乙個點的最短路條數,若相等則最短路條數\(+1\)

#include#include#includeusing namespace std;

const int mod=100003;

int n,m,head[1000005],cnt,dis[1000005],num[1000005];

bool vis[1000005];

struct nodea[4000005];

long long read()

while(ch>='0'&&ch<='9')

return x*f;

}void add(int x,int y)

void spfa()

else if(dis[v]==dis[u]+1) num[v]=(num[v]+num[u])%mod;

} }int main()

for(int i=1;i<=n;++i) dis[i]=37022059;

dis[1]=0,num[1]=1;

spfa();

for(int i=1;i<=n;++i) printf("%d\n",num[i]);

return 0;

}

這是嚴格次短路。

考慮在什麼情況下會更新最短路。

\(1、\)由父親節點過來的距離小於最短路,那麼當前最短路變成次短路,更新最短路

\(2、\)若當前距離不能更新最短路,但比次短路小,更新次短路

\(3、\)若從父親節點過來的次短路能更新當前次短路,更新次短路

所以,求次短路只需要一遍\(spfa\)在更新最短路的時候順便更新次短路就好了

放一道題

#include#include#includeusing namespace std;

int n,m,head[5005],cnt,dis[2][5005];

bool vis[5005];

struct diera[200005];

void add(int x,int y,int z)

long long read()

while(c>='0'&&c<='9')

return f?-x:x;

}void spfa()

}}int main()

spfa();

printf("%d",dis[0][n]);

return 0;

}

詳情見牛慢跑

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

最短路徑演算法 最短路

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

最短路(最短路之積)

首先考慮暴力維護,顯然極端資料就會炸裂,那麼用什麼來維護呢?考慮乙個很 nb的公式log n m log n log m ok,這道題到此結束 我們只要把乘積轉化為對數,最後再還原就可以了,也不用考慮精度問題,本蒟蒻試著用pow,然後它死了。includeusing namespace std co...