【悬关求调】萌新刚学OI,求调迪杰斯特拉(3MLE7WA)。
查看原帖
【悬关求调】萌新刚学OI,求调迪杰斯特拉(3MLE7WA)。
728483
wwwidk1234楼主2023/8/1 19:22

Record Link

rt,用的Dijkstra算法

#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e4+10;
int n,m;
int g[N][N];
int s[N];
bool vis[N];
int ans[N];
//创建了一个小根堆
struct Node
{
	int to; //终点
	int w; //边权
};
template<class T>
class cmp
{
	public:bool operator()(T A,T B){return A.w>B.w;}
};
priority_queue<Node,vector<Node>,cmp<Node>> q;
//朴素版dijkstra 时间复杂度 O(n^2)
void dijkstra(int k)
{
	//q堆初始化:起点与其他结点的距离计算出来放进s集合
	for(int i=2;i<=n;i++)
	{
		if(g[k][i]==0) g[k][i]=INT_MAX;
		q.push(Node{i,g[k][i]});
	}
	//每次循环处理掉一个点(起点除外)
	for(int i=1;i<n;i++)
	{
		//在堆里面找最小值
		Node p=q.top(); q.pop();
		//以当前点作为中转点更新其他点到起点的距离
		for(int j=1;j<=n;j++)
		{
			int dis=(g[p.to][j]==INT_MAX)?(INT_MAX):(p.w+g[p.to][j]);
			if(dis!=INT_MAX) q.push({j,dis});
		}
	}
	vis[k]=1;
	while(!q.empty())
	{
		Node p=q.top();q.pop();
		if(!vis[p.to])
		{
			ans[p.to]=p.w;
			vis[p.to]=1;
		}
	}
}
signed main()
{
	int start;
	cin>>n>>m>>start;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		g[u][v]=g[v][u]=w;
	}
	dijkstra(start);
	for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
	return 0;
}

不加堆优化的:

#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e4+10;
int n,m;
int g[N][N];
int s[N];
bool vis[N];
//朴素版dijkstra 时间复杂度 O(n^2)
void dijksrta(int k)
{
	//s集初始化:起点与其他结点的距离计算出来放进s集合
	for(int i=1;i<=n;i++) s[i]=g[k][i];
	s[k]=0,vis[k]=1;
	int cur=k;
	//每次循环处理掉一个点(起点除外)
	for(int i=1;i<n;i++)
	{
		int minn=INT_MAX;
		//在s集里面找最小值
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&s[j]<minn)
			{
				minn=s[j],cur=j;
			}
		}
		vis[cur]=1;
		s[cur]=minn;  //以当前点作为中转点更新其他点到起点的距离
		for(int j=1;j<=n;j++)
		{
			int dis=(g[cur][j]==INT_MAX)?(INT_MAX):(minn+g[cur][j]);
			if(!vis[j]&&dis<s[j]) s[j]=dis;
		}
	}
}
signed main()
{
	int start;
	cin>>n>>m>>start;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		g[u][v]=g[v][u]=w;
	}
	dijksrta(start);
	for(int i=1;i<=n;i++) cout<<s[i]<<" ";
	return 0;
}
2023/8/1 19:22
加载中...