dikjstra写法,50分求解?
  • 板块P1396 营救
  • 楼主tonyG
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/10/25 23:14
  • 上次更新2023/11/5 09:51:57
查看原帖
dikjstra写法,50分求解?
128353
tonyG楼主2020/10/25 23:14
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#define MAXN 10005
#define MAXM 20005
#define INF 0x3f3f3f
using namespace std;
struct edge
{
	int v,w;
	edge(int v=0,int w=0)
	{
		this->v=v;
		this->w=w;
	}
	friend bool operator <(edge a,edge b)
	{
		return a.w<b.w;
	}
};
struct node
{
	int id,d;
	node(int id=0,int d=0)
	{
		this->id=id;
		this->d=d;
	}
	friend bool operator <(node a,node b)
	{
		return a.d<b.d;
	}
};

vector <edge> adj[MAXM];
int d[MAXN];
bool vis[MAXN];
int n,m,s,t;

void dikjstra(int s)
{
	for(int i=1;i<=n;i++)
	{
		d[i]=INF;
	}
	priority_queue<node> q;
	q.push(node(s,0));
	d[s]=0;
	
	int u,v,w;
	while(!q.empty())
	{
		u=q.top().id;
		q.pop();
		if(vis[u]==1)
		    continue;
		vis[u]=1;
		for(int k=0;k<adj[u].size();k++)
		{
			v=adj[u][k].v;
			w=adj[u][k].w;
			if(d[v]>max(d[u],w))
			{
				d[v]=max(d[u],w);
				//cout<<u<<"->"<<v<<endl;
				q.push(node(v,d[v]));
			}
		}
	}
}
int main()
{
int u,v,w;
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++)
{
	cin>>u>>v>>w;
	adj[u].push_back(edge(v,w));
	adj[v].push_back(edge(u,w));
}
for(int i=1;i<=n;i++)
{
	sort(adj[i].begin(),adj[i].end());
}
dikjstra(s);
cout<<d[t];
return 0;
}


2020/10/25 23:14
加载中...