ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P1342 请柬【题解】

2021-10-04 20:29:56  阅读:122  来源: 互联网

标签:memset int 题解 请柬 back dijkstra fd maxn P1342


最短路裸题

题目大意:

拿到题目扫了一眼,大概出了个这样的思路:建个图,先以 1 1 1为源点跑一次最短路,再以除了 1 1 1以外的 n − 1 n-1 n−1个点为源点跑 n − 1 n-1 n−1次最短路。若不考虑某已死的算法(我们采用 d i j k s t r a dijkstra dijkstra),这种做法的时间复杂度为 Θ ( N 2 log ⁡ N ) \Theta(N^2\log{N}) Θ(N2logN), q w q qwq qwq结果被 T \red{T} T上天了。后来又想到一个奇妙的性质:第二遍的 n − 1 n-1 n−1次 d i j k s t r a dijkstra dijkstra其实可以省去,我们以原图为基础建立反图,再在这个反图上以 1 1 1为源点跑一次最短路即可。最后一次扫描将答案累加即可。

还有一件比较有趣的事情:我在交不用堆优化的 d i j k s t r a dijkstra dijkstra时不放心开了 O 2 O_2 O2​,结果 M L E MLE MLE了三个点。不开优化又超时,最后靠数组的空间卡过去的。还是老老实实多打点代码吧。

A C   C o d e : \blue{AC \space Code:} AC Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
typedef long long LL;

int n,m,v[maxn];
LL ans,d[maxn],fd[maxn];
vector<int> ver[maxn],fver[maxn];
vector<LL> edge[maxn],fedge[maxn];

inline void read()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;LL w;
		cin>>u>>v>>w;
		ver[u].push_back(v);
		fver[v].push_back(u); 
		edge[u].push_back(w);
		fedge[v].push_back(w);
	}
}

inline void dijkstra()
{
	memset(v,0,sizeof(v));
	memset(d,0x3f,sizeof(d));
	
	d[1]=0;
	for(int i=1;i<n;i++)
	{
		int x=0;
		for(int j=1;j<=n;j++)
		{
			if(!v[j]&&(x==0||d[j]<d[x])) x=j;
		}
		v[x]=1;
		for(int y=0;y<ver[x].size();y++)
		{
			int t=ver[x][y];
			d[t]=min(d[t],d[x]+edge[x][y]);
		}
	}
}

inline void fdijkstra()
{
	memset(v,0,sizeof(v));
	memset(fd,0x3f,sizeof(fd));
	fd[1]=0;
	for(int i=1;i<n;i++)
	{
		int x=0;
		for(int j=1;j<=n;j++)
		{
			if(!v[j]&&(x==0||fd[j]<fd[x])) x=j;	
		}	
		v[x]=1;
		for(int y=0;y<fver[x].size();y++)
		{
			int t=fver[x][y];
			fd[t]=min(fd[t],fd[x]+fedge[x][y]);
		}
	}	
}

int main()
{
	ios::sync_with_stdio(false);
	read();
	dijkstra();
	fdijkstra();
	for(int i=2;i<=n;i++)
	{
		ans+=d[i];
		ans+=fd[i];
	}
	cout<<ans<<endl;
	return 0;
}

标签:memset,int,题解,请柬,back,dijkstra,fd,maxn,P1342
来源: https://blog.csdn.net/qq_62444770/article/details/120607560

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有