最短路学习笔记
比赛情况
我说我忘了最短路你信吗。
最短路可以看我未开智时写的blog
T1 路径统计
考场上算出最短路后跑了个 dfs (你咋不直接跑 dfs 啊
可以发现 如果 \((1,v)<(1,u)+w\) ,那到 \(v\) 的最短路数量为 到\(u\) 的最短路数量。如果 \((1,v)=(1,u)+w\) ,那到 \(v\) 的最短路数量加上 到\(u\) 的最短路数量。
code:
#include<bits/stdc++.h>
using namespace std;
struct e{
int u,v,w;
};
int g[2010][2010];
vector<e> G[2010];
int n,m;
bool f[2010];
int len[2010];
int cnt[2010];
void Dijstar(int s){
priority_queue<pair<int,int> > q;
for(int i=1;i<=n;i++)len[i]=INT_MAX;
len[s]=0;
q.push({0,s});
cnt[s]=1;
while(q.size()){
int tu=q.top().second;
q.pop();
if(f[tu])continue;
f[tu]=1;
cnt[s]=1;
for(int i=0;i<G[tu].size();i++){
int u=tu,v=G[tu][i].v,w=G[tu][i].w;
if(len[u]+w<len[v]){
len[v]=len[u]+w;
cnt[v]=cnt[u];
q.push({-len[v],v});
}else if(len[u]+w==len[v])cnt[v]+=cnt[u];
}
}
if(len[n]==INT_MAX){
cout<<"No answer";
exit(0);
}
cout<<len[n]<<" "<<cnt[n];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
g[i][j]=INT_MAX;
}
}
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
g[u][v]=min(g[u][v],w);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][j]!=INT_MAX)G[i].push_back({i,j,g[i][j]});
}
}
Dijstar(1);
return 0;
}
还有有dalao可以解释为啥 SPAF 会 WA 吗?
T2 Snaky Walk
跑两遍 bfs 即可。
T3 Our clients, please wait a moment
你可以从班车换乘火车,但不能反向换乘。 不会只有我没看到吧!
分层图最短路,第一层为 公司班车 ,第二层为 火车,从第一层到第二层的花费为 \(0\) 。
T6 [USACO06NOV] Roadblocks G
猫猫头:今天只有最短路。
对 '次' \(=\) '最' 。
次短路板子题。
学习次短路ing
浙公网安备 33010602011771号