这个假得离谱的玩意为什么能过
查看原帖
这个假得离谱的玩意为什么能过
299922
atarashiTLE楼主2023/10/17 17:28

如题。主要错误点:修改了堆中点优先级相对值,dijkspfa。

#include<bits/stdc++.h>
#define il inline
#define re register
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
struct ln{
	int u,v,w,nxt;
}a[400010];
struct fk{
	int a;
	fk(int b){a=b;}
	fk(){}
};
int dij[100010],lnsz,hd[100010],n,m,u,v,w,sor;
bool vis[100010];
void mrg(int u,int v,int w){
	a[++lnsz].u=u;
	a[lnsz].v=v;
	a[lnsz].w=w;
	a[lnsz].nxt=hd[u];
	hd[u]=lnsz;
}
struct cmp{
	bool operator () (int a,int b){
		return dij[a]>dij[b];
	}
};
priority_queue<int,vector<int>,cmp> q;
void dijk(int root){
	dij[root]=0;vis[root]=1;
	q.push(root);
	while(!q.empty()){
		int tp=q.top();q.pop();vis[tp]=0;
		for(int i=hd[tp];i;i=a[i].nxt)
			if(dij[a[i].v]>dij[tp]+a[i].w){
				dij[a[i].v]=dij[tp]+a[i].w;
				if(!vis[a[i].v]){
					vis[a[i].v]=1;
					q.push(a[i].v);
				}
			}
	}
}
signed main(){
	cin>>n>>m>>sor;
	for(int i=0;i<m;i++){
		cin>>u>>v>>w;
		mrg(u,v,w);
	}
	for(int i=0;i<=n;i++)dij[i]=INF;
	dijk(sor);
	for(int i=1;i<=n;i++)
		cout<<dij[i]<<' ';
	cout<<endl;
	return 0;
}
2023/10/17 17:28
加载中...