目錄次短路
短路\(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...