首页 > 其他分享 >P2299Mzc和体委的争夺战题解

P2299Mzc和体委的争夺战题解

时间:2022-10-30 08:55:07浏览次数:64  
标签:head dist int 题解 cnt P2299Mzc 体委 vis maxn

这是一道Dijkstra经典题目(裸题)

P2299Mzc和体委的争夺战



代码思路:Dijkstra+链式前向星+优先队列+结构体

其实很简单的

重点:

if(vis[n])
    return ;


意思是找到了立即返回,这样可以节约许些时间

 



代码核心:

inline void dijkstra(int u){
	priority_queue<node>q;
	memset(dist, INF,sizeof(dist));
	dist[u] = 0;
	q.push(node(u,dist[u]));
	while(!q.empty()){
		int v = q.top().u;
		q.pop();
		if(vis[n])
			return ;		
		if(vis[v])
			continue;
		vis[v] = 1;
       //这里我写复杂了
		for(int i = head[v];i;i = E[i].next){
			if(!vis[E[i].to]&&dist[E[i].to]>dist[v]+E[i].w){
				dist[E[i].to] = dist[v] + E[i].w;
				q.push(node(E[i].to,dist[E[i].to]));
			}
		}
	}
}

将Dijkstra稍微改一改,符合题意即可

 


这是实现优先队列内部从小到大以dist为标准排序
运用了重载运算符

	bool operator < (const node &a)const {
		return dist > a.dist;
	}

 



下面是完整代码

 

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = 2505;
const int INF = 0x3f3f3f3f;
inline int read(){
	int x = 0;char c = getchar();
	while(c<'0'||c > '9') c = getchar();
	while(c>='0'&& c <='9') x = (x<<1)+(x<<3)+(c^48),c = getchar();
	return x;
}
struct node{
	int u, dist;
	node(){};
	node(int u_,int dist_){
		u = u_,dist = dist_;
	}
	bool operator < (const node &a)const {
		return dist > a.dist;
	}
};
struct edge{
	int to,next,w;
}E[maxn*maxn];
int head[maxn];
int cnt;
inline void add(int u,int v,int w){
	E[++cnt].to = v;
	E[cnt].w = w;
	E[cnt].next = head[u];
	head[u] = cnt;
}
int n,m;
int dist[maxn];
bool vis[maxn];
inline void dijkstra(int u){
	priority_queue<node>q;
	memset(dist, INF,sizeof(dist));
	dist[u] = 0;
	q.push(node(u,dist[u]));
	while(!q.empty()){
		int v = q.top().u;
		q.pop();
		if(vis[n])
			return ;		
		if(vis[v])
			continue;
		vis[v] = 1;
       //这里我写复杂了
		for(int i = head[v];i;i = E[i].next){
			if(!vis[E[i].to]&&dist[E[i].to]>dist[v]+E[i].w){
				dist[E[i].to] = dist[v] + E[i].w;
				q.push(node(E[i].to,dist[E[i].to]));
			}
		}
	}
}
int main(){
	n = read(),m = read();
	int u,v,w;
	memset(head,-1,sizeof(head));
	for(int i = 0;i<m;i++){
		u = read(), v = read(), w = read();
		add(u,v,w);
		add(v,u,w);
	}
	dijkstra(1);
	cout << dist[n];
	return 0;
}

 

 


下面是提交结果:

膜拜youyi2008大佬 他老人家是第一

标签:head,dist,int,题解,cnt,P2299Mzc,体委,vis,maxn
From: https://www.cnblogs.com/adidecd/p/16840485.html

相关文章

  • Python 多重继承时metaclass conflict问题解决与原理探究
    背景最近有一个需求需要自定义一个多继承abc.ABC与django.contrib.admin.ModelAdmin两个父类的抽象子类,方便不同模块复用大部分代码,同时强制必须实现所有抽象方法,没想按想......
  • 洛谷P8539 「Wdoi-2」来自地上的支援 题解
    ST表做法思路当进行第\(x\)次操作时,若\(b_1\)到\(b_{x-1}\)中有比\(b_x\)大的数,那这次操作轮不到\(b_x\),并且前面的本来就比它大的数只会越来越大,所以以后的......
  • LeetCode 题解 | 1. 两数之和 Javascript 版
    题目给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个......
  • LeetCode 题解 | 3. 无重复字符的最长子串 Javascript
    /***@param{string}str*@returnsnumber*思路:1.start与range组合成一个窗口,窗口内的子串就是当前最长不重复的字符串*2.range每次循环递增*......
  • LeetCode 题解|6. Z 字形变换
    /***@param{string}s*@param{number}numRows*@return{string}*/varconvert=function(s,numRows){//存储结果constrows=[];//指针下一......
  • LeetCode 题解|9. 回文数
    /***@param{number}x*@return{boolean}*/varisPalindrome=function(x){if(x<0){returnfalse;}letnum=x;letreverse=0;wh......
  • LeetCode 题解|7. 整数反转
    /***@param{number}x*@return{number}*/varreverse=function(x){letres=0;while(x!=0){res=res*10+(x%10);//划重点......
  • CSP-S2022游记&几句话题解
    T1对于每一个点\(u\),计算点权最大的三个点,满足\(dis(u,v)\lek+1,dis(1,v)\lek+1\)。然后枚举\(B,C\),\(3^2\)枚举即可。复杂度\(O(n^2)\)。考场代码#inclu......
  • python(牛客)试题解析1 - 入门级
    导航:一、NC103反转字符串二、NC141判断是否为回文字符串三、NC151最大公约数四、NC65斐波那契数列----------分-割-线-----------一、NC10......
  • 洛P8109题解
    摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p8109本题原题目摘录:本场比赛共有\(n\)道题,Cirno已经精确预测了每道题目的AC队......