dijkstra求调
  • 板块灌水区
  • 楼主xieyuchendgzx
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/18 17:47
  • 上次更新2024/9/18 20:48:12
查看原帖
dijkstra求调
1352326
xieyuchendgzx楼主2024/9/18 17:47

https://oj.dgzx.net/front/problem/ToProblemDetailBlank/1043

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define INF 0x3f3f3f3f
struct edge
{
	int to;
	int w;
};
vector<edge> head[1001];
priority_queue<edge> q;
bool operator <(const edge &a,const edge &b){
	return a.w>b.w;
} 
int dis[1001];
bool vis[1001];
int main() 
{
	int n,w;
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>w;
			if(w) head[i].push_back({j,w});	 
		}
	}
	for(int i=1;i<=n;i++) dis[i]=INF;
	int x,y;
	cin>>x>>y;
	vis[x]=true;
	dis[x]=0;
	for(int i=1;i<head[x].size();i++)
	{
		int u=head[x][i].to;//与起点直连点 
		dis[u]=head[x][i].w;//因为直连,dis[u]等于x,u边权值 
		q.push({u,dis[u]});//入队 
	}
	while(!q.empty())//有未更改点 
	{
		//出队 
		edge d=q.top();
		q.pop();
		int u=d.to;
		if(vis[u]) continue;
		vis[u]=true;
		for(int i=1;i<head[u].size();i++)
		{
			int v=head[u][i].to;//其边另一点 
			if(!vis[v]&&dis[u]+head[u][i].w<dis[v])//head[u][i].w u与v距离 
			{
				dis[v]=dis[u]+head[u][i].w;//更改 
				q.push({v,dis[v]});	//入队 
			}	
		} 
	}
	cout<<dis[y];
	return 0;
}
2024/9/18 17:47
加载中...