200字
「模板」Dijkstra
2025-11-01
2025-11-01

CSP-S考试当天复习打了个模板,以弥补我前半个月没打图论。

#include <bits/stdc++.h>
using namespace std;
int dist[1145],vis[1145],fa[1145],n,m,q,cnt;
vector<pair<int,int> > mp[1145];
int main()
{
	cin>>n>>m>>q;
	int u,v,r;
	for(int i=1;i<=m;i++) {//建图 
		cin>>u>>v>>r;
		mp[u].push_back(make_pair(v,r));
		//mp[v].push_back(make_pair(u,r));//有向图和无向图 
	}

	for(int i=2;i<=n;i++)//初始化 
		dist[i]=INT_MAX;
	fa[1]=1;

	int min1=INT_MAX;
	for(int i=1;i<=n;i++) {
		min1=INT_MAX;
		for(int j=1;j<=n;j++)//求当前最小距离 
			if(dist[j]<min1 and vis[j]==0)
				min1=dist[u=j];

		vis[u]=1;
		int sz=mp[u].size();
		for(int j=0;j<sz;j++) {
			v=mp[u][j].first;
			r=mp[u][j].second;
			if(dist[u]+r<dist[v])//更新距离 
				dist[v]=dist[fa[v]=u]+r;
		}
	}

	for(int i=1;i<=q;i++) {
		cin>>r;
		cout<<dist[r]<<" "<<r;
		while(r!=fa[r])
			cout<<"<-"<<(r=fa[r]);//输出路径 
	}
	return 0;
}

/*
in
6 10 1
1 2 5
1 3 35
1 4 40
2 4 20
2 5 25
3 5 30
3 6 25
4 6 20
5 6 25
5 4 45
6

out
45 6<-4<-2<-1
*/

考场上我应该不敢这么压行。