最短路学习笔记

比赛情况

我说我忘了最短路你信吗。
最短路可以看我未开智时写的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

posted on 2026-08-18 12:33  zzyycc2013  阅读(9)  评论(0)    收藏  举报