求助dij堆优化+邻接表
  • 板块灌水区
  • 楼主Surge_of_Force
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/10 09:46
  • 上次更新2023/11/4 04:12:48
查看原帖
求助dij堆优化+邻接表
230875
Surge_of_Force楼主2021/10/10 09:46

P2984

#include<bits/stdc++.h>
#define ll long long
const int MAX=5e4+10;
using namespace std;
inline ll read()
{
	char qwqc=getchar();ll qwqf=1,qwqx=0;
	while(qwqc<'0'||qwqc>'9'){if(qwqc=='-') qwqf=-1;qwqc=getchar();}
	while(qwqc>='0'&&qwqc<='9'){qwqx=(qwqx<<3)+(qwqx<<1)+(qwqc^48);qwqc=getchar();}
	return qwqf*qwqx;
}
inline void write(ll x)
{
	if(x<0){putchar('-');x=-x;}
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
struct edge
{
	int u,v,w;
};
struct node
{
	int ni,w;
	bool operator < (const node &xx)const
	{
		return xx.w<w;
	}
};
int n,m,b;
vector<int> s[MAX];
vector<edge> eg;
priority_queue<node> q;
int dis[MAX],vis[MAX];
void dij(int ss)
{
	dis[ss]=0;
	q.push((node){1,0});
	while(!q.empty())
	{
		node ff=q.top();
		q.pop();
		int vv=ff.ni,ww=ff.w;
		if(vis[vv]) continue;
		vis[vv]=1;
		for(int i=0,siz=s[vv].size();i<siz;i++)
		{
			int sv=eg[s[vv][i]].v;
			if(dis[vv]+ww<dis[sv])
			{
				dis[sv]=dis[vv]+ww;
				q.push((node){sv,ww});
			}
		}
		for(int i=0;i<m;i++) cout<<dis[i]<<" ";
		cout<<endl;
	}
}
int main()
{
	n=read();m=read();b=read();
	memset(dis,10,sizeof(dis));
	for(int i=0;i<m;i++)
	{
		int u=read(),v=read(),w=read();
		s[u].push_back(i);
		eg.push_back((edge){u,v,w});
		s[v].push_back(i);
	}
	dij(1);
	for(int i=1;i<=b;i++)
	{
		int p=read(),qq=read();
		write(dis[p]+dis[qq]);
		putchar('\n');
	}
	return 0;
}
2021/10/10 09:46
加载中...