P2984 [USACO10FEB] Chocolate Giving S

P2984 [USACO10FEB] Chocolate Giving S

题目理解:

本题就是给你一个无向图,求从其中一个点到另一个点(其中必经过\(1\)号点)的最短路。我们只需要转换一下,也就是求从一号点到任意一点的最短路,询问时只需要输出一号点到那两个点的最短路和即可。用\(Dijkstra\)跑一遍即可

完整代码:

#include<bits/stdc++.h>
using namespace std;
const int N=50010;
struct edge{
	int v,w;
};
struct node{
	int dis,u;
	bool operator>(const node& a)const{return dis>a.dis;}
};
int dis[N],vis[N];
priority_queue<node,vector<node>,greater<node>>q;
vector<edge>e[N];
void dijkstra(){
	memset(dis,0x3f,sizeof(dis));
	q.push({0,1});
	dis[1]=0;
	while(!q.empty()){
		int u=q.top().u;
		q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(auto ed:e[u]){
			int w=ed.w,v=ed.v;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				q.push({dis[v],v});
			}
		}
	}
}
int main(){
	int n,m,b;
	cin>>n>>m>>b;
	for(int i=1;i<=m;i++){
		int u,v,w; 
		cin>>u>>v>>w;
		e[u].push_back({v,w});
		e[v].push_back({u,w});
	}
	dijkstra(); 
	for(int i=1;i<=b;i++){
		int x,y;
		cin>>x>>y;
		cout<<dis[x]+dis[y]<<endl;
	}
}

\(dijkstra\)原理讲解

posted @ 2025-01-20 19:04  XichenOC  阅读(35)  评论(0)    收藏  举报