BZOJ 3891 Usaco2014 Dec Piggy Back BFS

题目大意:给出一张无向图,有两个人,分别在1和2,他们要到n,一个人走的消耗是c1,c2,两个人一起走是c3,问最少消耗。

思路:题中说是可以一起走,而不是必须一起走,所以之需要看这两个人到所有点的距离,还有每个点到终点的距离,之后枚举从那个点开始一起走,求一下最小值就可以了。

CODE:

#define _CRT_SECURE_NO_WARNINGS

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 100010
#define INF 0x3f3f3f3f
using namespace std;

int c1,c2,futari;
int points,edges;

int head[MAX],total;
int _next[MAX],aim[MAX];

inline void Add(int x,int y)
{
	_next[++total] = head[x];
	aim[total] = y;
	head[x] = total;
}

int dis1[MAX],dis2[MAX],dis_final[MAX];

void BFS(int start,int arr[])
{
	static queue<int> q;
	static bool v[MAX];
	memset(v,false,sizeof(v));
	q.push(start);
	v[start] = true;
	while(!q.empty()) {
		int x = q.front(); q.pop();
		for(int i = head[x]; i; i = _next[i]) {
			if(v[aim[i]])	continue;
			v[aim[i]] = true;
			arr[aim[i]] = arr[x] + 1;
			q.push(aim[i]);
		}
	}
}

int main()
{
	cin >> c1 >> c2 >> futari >> points >> edges;
	for(int x,y,i = 1; i <= edges; ++i) {
		scanf("%d%d",&x,&y);
		Add(x,y),Add(y,x);
	}
	BFS(1,dis1);
	BFS(2,dis2);
	BFS(points,dis_final);
	int ans = INF;
	for(int i = 1; i <= points; ++i)
		ans = min(ans,c1 * dis1[i] + c2 * dis2[i] + futari * dis_final[i]);
	cout << ans << endl;
	return 0;
}

时间: 2024-12-22 12:35:45

BZOJ 3891 Usaco2014 Dec Piggy Back BFS的相关文章

3891: [Usaco2014 Dec]Piggy Back

3891: [Usaco2014 Dec]Piggy Back Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 116  Solved: 92[Submit][Status][Discuss] Description Bessie and her sister Elsie graze in different fields during the day, and in the evening they both want to walk back

bzoj3891[Usaco2014 Dec]Piggy Back*

bzoj3891[Usaco2014 Dec]Piggy Back 题意: 给定一个N个点M条边的无向图,其中Bessie在1号点,Elsie在2号点,它们的目的地为N号点.Bessie每经过一条边需要消耗B点能量,Elsie每经过一条边需要消耗E点能量.当它们相遇时,它们可以一起行走,此时它们每经过一条边需要消耗P点能量.求它们两个到达N号点时最少消耗多少能量.n,m≤40000. 题解: 先求出以1.2.n为源点的最短路(因为边权为1所以用bfs).答案初始设为1到n的最短路*B+2到n的最

BZOJ 3892 Usaco2014 Dec Marathon DP

题目大意:给出平面上的一些点,要求按顺序遍历,费用是两点之间的曼哈顿距离,可以跳过k次,问最少需要花费多少. 思路:O(n^3)dp就行了. CODE: #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 510 using namespace std; struct

BZOJ 3893 Usaco2014 Dec Cow Jog 模拟

题目大意:给出n头牛他们的初始位置和各自的速度,一头牛追上另一头牛之后这两头牛会变成一头牛,问最后剩下几头牛. 思路:简单模拟一下不难发现,我们只要算出如果正常行驶每头牛的最后到达的地点,从后往前扫一下,有多少个单调不减的序列就是最后有多少头牛. CODE: #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #include <iostream> #include <algor

BZOJ 3892 [Usaco2014 Dec]Marathon 动态规划

题目大意:给定n个点,定义从一个点到另一个点的距离为曼哈顿距离,要求从点1依次走到点n,中途可以跳过k个点不走,求最小距离和 令f[i][j]表示从第一个点走到第i个点中途跳过j次的最小距离和 则有f[i][j]=min{f[i-k-1][j-k]+dis[i-k-1][i]} 时间复杂度O(n^3) #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #

BZOJ 3893 [Usaco2014 Dec]Cow Jog

题目大意:给定一些牛,每头牛有一个初始位置和速度,如果某头牛能追上后面的那头速度就会和后面那头一样,求T分钟后会形成多少小团体 <论排序算法的低效性和如何避免使用排序算法以及认真读题的重要性> 一头牛的速度不会被后面的牛所影响 因此我们从后往前扫,如果当前的牛追不上后面那个小团体中最慢的那头牛,这头牛就成为新的小团体 时间复杂度O(n) 注意数据有点问题,虽然说初始位置和速度都小于等于100W但是实际上有比这个大的 #include <cstdio> #include <cs

bzoj 3824: [Usaco2014 Dec]Guard Mark【状压dp】

设f[s]为已经从上到下叠了状态为s的牛的最大稳定度,转移的话枚举没有在集合里并且强壮度>=当前集合牛重量和的用min(f[s],当前放进去的牛还能承受多种)来更新,高度的话直接看是否有合法集合的高度达到要求即可 #include<iostream> #include<cstdio> using namespace std; const int N=25; int n,m,h[N],w[N],a[N],f[2000005],ans=-1; int main() { scanf

3893: [Usaco2014 Dec]Cow Jog

3893: [Usaco2014 Dec]Cow Jog Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 174  Solved: 87[Submit][Status][Discuss] Description The cows are out exercising their hooves again! There are N cows jogging on an infinitely-long single-lane track (1 <= N

3892: [Usaco2014 Dec]Marathon

3892: [Usaco2014 Dec]Marathon Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 169  Solved: 100[Submit][Status][Discuss] Description Unhappy with the poor health of his cows, Farmer John enrolls them in an assortment of different physical fitness acti