首页 > 其他分享 >洛谷题解-P1821 [USACO07FEB] Cow Party S

洛谷题解-P1821 [USACO07FEB] Cow Party S

时间:2024-01-27 19:55:05浏览次数:34  
标签:dis2 洛谷 Cow leq int 题解 memset vis dis

https://www.luogu.com.cn/problem/P1821

题目描述

寒假到了,nnn 头牛都要去参加一场在编号为 xxx 的牛的农场举行的派对,农场之间有 mmm 条有向路,每条路都有一定的长度。

每头牛参加完派对后都必须回家,无论是去参加派对还是回家,每头牛都会选择最短路径,求这 nnn 头牛的最短路径(一个来回)中最长的一条路径长度。

输入格式

第一行有三个整数,分别表示牛的数量 nnn,道路数 mmm 和派对农场编号 xxx。
接下来 mmm 行,每行三个整数 u,v,wu, v, wu,v,w,表示存在一条由 uuu 通向 vvv 的长度为 www 的道路。

输出格式

输出一行一个整数表示答案。

输入输出样例

输入 #1
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
输出 #1
10

说明/提示

样例 1 解释

数据规模与约定

对于全部的测试点,保证 1≤x≤n≤1031 \leq x \leq n \leq 10^31≤x≤n≤103,1≤m≤1051 \leq m \leq 10^51≤m≤105,1≤u,v≤n1 \leq u,v \leq n1≤u,v≤n,1≤w≤1021 \leq w \leq 10^21≤w≤102,保证从任何一个结点出发都能到达 xxx 号结点,且从 xxx 出发可以到达其他所有节点。

 

 

从1,2,3,4,5..n-1个点到n,可以反向建边,然后从n到1,2,3,...n-1个点;

另外,这题不能瞎*2输出(别只看一个来回),要跑2遍(1...n到x)-> (x到1..n但是反向),(x到1...n但是正向)

 

#include <bits/stdc++.h>
using namespace std;

const int N=1e5+5;
struct node
{
	int v, w;
	bool operator <(const node &A) const
	{
		return w>A.w;
	}
};
int n, m, x, u1, v1, w1, dis[N], vis[N], dis2[N], ans=0;
vector<node> a[N], a2[N];
priority_queue<node> q;
void dij(int s)
{
	memset(dis, 63, sizeof dis);
	memset(vis, 0, sizeof vis);
	dis[s]=0, q.push({s, 0});
	
	while (!q.empty())
	{
		int u=q.top().v;
		q.pop();
		
		if (vis[u]) continue;
		vis[u]=1;
		
		for (int i=0; i<a[u].size(); i++)
		{
			int v=a[u][i].v, w=a[u][i].w;
			if (!vis[v] && dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				q.push({v, dis[v]});
			}
		}
	}
}
void dij2(int s)
{
	memset(dis2, 63, sizeof dis2);
	memset(vis, 0, sizeof vis);
	dis2[s]=0, q.push({s, 0});
	
	while (!q.empty())
	{
		int u=q.top().v;
		q.pop();
		
		if (vis[u]) continue;
		vis[u]=1;
		
		for (int i=0; i<a2[u].size(); i++)
		{
			int v=a2[u][i].v, w=a2[u][i].w;
			if (!vis[v] && dis2[v]>dis2[u]+w)
			{
				dis2[v]=dis2[u]+w;
				q.push({v, dis2[v]});
			}
		}
	}
}
int main()
{
	scanf("%d%d%d", &n, &m, &x);
	for (int i=1; i<=m; i++)
	{
		scanf("%d%d%d", &u1, &v1, &w1);
		a[v1].push_back({u1, w1});
		a2[u1].push_back({v1, w1});
	}
	dij(x);
	dij2(x);
	
	for (int i=1; i<=n; i++) ans=max(ans, dis[i]+dis2[i]);
	printf("%d", ans);
	return 0;
}

标签:dis2,洛谷,Cow,leq,int,题解,memset,vis,dis
From: https://www.cnblogs.com/didiao233/p/17991846

相关文章

  • 洛谷题解-P1673 [USACO05FEB] Part Acquisition S
    https://www.luogu.com.cn/problem/P1673题目描述奶牛们接到了寻找一种新型挤奶机的任务,为此它们准备依次经过N(1≤N≤5×104)N(1\leN\le5\times10^4)N(1≤N≤5×104)颗行星,在行星上进行交易。为了方便,奶牛们已经给可能出现的K(1≤K≤103)K(1\leK\le10^3)K(1≤K≤103)......
  • CF739A Alyona and mex 题解
    题目传送门前置知识贪心|构造解法从贪心的角度分析,最小的\(\operatorname{mex}\)仅会与长度最小的区间有关;另外为使得\(\operatorname{mex}\)最大,当\(\operatorname{mex}\)等于区间长度的时候即为所求。记\(ans\)表示此时得到的答案。构造序列时,长度最小的区间一定......
  • CF1433E Two Round Dances 题解
    题目传送门前置知识圆排列解法\(\dfrac{Q_{n}^{\frac{n}{2}}Q_{\frac{n}{2}}^{\frac{n}{2}}}{A_{2}^{2}}\)即为所求。同时因为\(n\le20\)和没有模数,所以不需要处理逆元,暴力算即可。代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineu......
  • 洛谷 P1749 [入门赛 #19] 分饼干 II 题解
    题目传送门先给结论:记\(S=1+2+\dots+k\),则当\(N\geS\)时为YES,当\(N<S\)时为NO。严谨一点,证明如下:若能成功分配饼干,记\(k\)名小朋友拿到的饼干数量分别为\(a_1,a_2,\dots,a_k\)。由于饼干数量各不相同且均为整数,不妨设\(a_1<a_2<\dots<a_k\),则\(a_2\gea_1+1,a_3\g......
  • 题解 NOIP2014 提高组-联合权值
    题解NOIP2014提高组-联合权值基本思路:以每个点为中转点,则与之相邻的点组成的点对都可产生联合权值,并且全覆盖。主要总结一下两种求权值和的思路:思路1(容斥):记与\(u\)相邻的点的集合为\(A\),则点\(u\)产生的贡献为\[ans_u=(\sum_{v\inA}w_i)^2-\sum_{v\inA}w_v\times......
  • P9550 「PHOI-1」晚宴筵题解
    题解简化一下题意,已知从\((p,q)\)直接到达\((x,y)\)的费用函数如下:\[\text{cost}(p,q,x,y)=\begin{cases}w_p+w_q+w_x+w_y-p-q-x-y,&l1_x\lep\ler1_x,l2_y\leq\ler2_y\\\text{inf},&\text{otherwise}\\\end{cases}\]问从\((1,1)\)到各位置的最小费用......
  • 洛谷题单指南-排序-P1177 【模板】排序
    原题链接:https://www.luogu.com.cn/problem/P1177题意解读:数据量为100000,必须用小于等于N*logN复杂度的排序算法,可以直接用sort,更重要需要掌握快速排序的过程。知识点:快速排序设定数组q[n],l,r第一步:确定分界点x可以取q[l]、q[(l+r)/2]、q[r]三种第二步:调整区间把<=x的数调......
  • 洛谷 P7906 [Ynoi2005] rpxleqxq
    洛谷传送门考虑莫队二次离线。剩下是平衡插入和查询复杂度的问题。考虑现在的问题:要求\(O(\sqrt{n})\)往集合里插入一个数,\(O(1)\)回答集合内有多少个数\(x\)满足\(z\oplusx\lem\)(\(z\)给定)。考虑高低位分块。先钦定\(z\)在前\(9\)位时\(z\oplusx<m\),枚举......
  • CodeForces 995F Cowmpany Cowmpensation
    洛谷传送门CF传送门考虑一个显然的树形dp,设\(f_{u,i}\)为\(u\)结点染颜色\(i\)的方案数,有\(f_{u,i}=\prod\limits_{v\inson_u}\sum\limits_{j=1}^if_{v,j}\)。前缀和后可得\(f_{u,i}=f_{u,i-1}+\prod\limits_{v\inson_u}f_{v,i}\)。发现\(f_......
  • P2602 数字计数 题解
    QuestionP2602数字计数求\([a,b]\)中的所有整数中,每个数出现的次数Solution数位DP板子题定义\(dp[i]\)表示\(i\)位数的每种数字有多少个,我们把\(0\)和\(00\)看成两种不同的数,并且\(00\)中算\(0\)出现过两次显然,\(0\sim9\)在\(i\)位数中出现的次数是一样......