首页 > 其他分享 >P2853 [USACO06DEC] Cow Picnic S

P2853 [USACO06DEC] Cow Picnic S

时间:2024-05-11 21:41:22浏览次数:17  
标签:P2853 Picnic USACO06DEC int qid ll vis hascow include

简单的一道深搜:
思路:让每个有奶牛的农场沿着道路跑下去,跑到的农场加上root地方的奶牛数量,最后统计能有k头奶牛的农场数量就是答案
代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;
const int N = 1e3 + 10;
ll hascow[N];
ll numofcow[N];
bool vis[N];
ll ans = 0;
vector<int>G[N];
void dfs(ll u,ll root)
{
	vis[u] = 1;
	for (int i = 0; i < G[u].size(); i++)
	{
		if(!vis[G[u][i]])
		{
			numofcow[G[u][i]] += hascow[root];
			dfs(G[u][i], root);
		}
	}
	
}
int main()
{
	ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
	ll k, n, m; cin >> k >> n >> m;
	queue<ll>qid;
	for (int i = 0; i < k; i++)
	{
		ll x; cin >> x;
		if(!hascow[x])qid.push(x);
		hascow[x] += 1;
		numofcow[x] = hascow[x];
	}
	for (int i = 0; i < m; i++)
	{
		ll u, v; cin >> u >> v;
		G[u].push_back(v);
	}
	//思路:从有牛的节点找起,然后给所有这个牛能到的节点加1,统计满的节点数量
	while (!qid.empty())
	{
		dfs(qid.front(),qid.front());
		qid.pop();
		memset(vis, 0, sizeof(vis));
	}
	for (int i = 1; i <= n; i++)
		if (numofcow[i] == k)
			ans++;
	cout << ans;
	return 0;
}


很神奇:那个一段如果改为以下:

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;
const int N = 1e3 + 10;
ll hascow[N];
ll numofcow[N];
bool vis[N];
ll ans = 0;
vector<int>G[N];
void dfs(ll u,ll root)
{
	vis[u] = 1;
	for (int i = 0; i < G[u].size(); i++)
	{
		if(!vis[G[u][i]])
		{
			numofcow[G[u][i]] += hascow[root];
			dfs(G[u][i], root);
		}
	}
	vis[u] = 0;
}
int main()
{
	ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
	ll k, n, m; cin >> k >> n >> m;
	queue<ll>qid;
	for (int i = 0; i < k; i++)
	{
		ll x; cin >> x;
		if(!hascow[x])qid.push(x);
		hascow[x] += 1;
		numofcow[x] = hascow[x];
	}
	for (int i = 0; i < m; i++)
	{
		ll u, v; cin >> u >> v;
		G[u].push_back(v);
	}
	//思路:从有牛的节点找起,然后给所有这个牛能到的节点加1,统计满的节点数量
	while (!qid.empty())
	{
		dfs(qid.front(),qid.front());
		qid.pop();
	}
	for (int i = 1; i <= n; i++)
		if (numofcow[i] == k)
			ans++;
	cout << ans;
	return 0;
}

就过不了
待查为什么...

标签:P2853,Picnic,USACO06DEC,int,qid,ll,vis,hascow,include
From: https://www.cnblogs.com/zzzsacmblog/p/18187203

相关文章

  • 洛谷题单指南-图的基本应用-P2853 [USACO06DEC] Cow Picnic S
    原题链接:https://www.luogu.com.cn/problem/P2853题意解读:找到所有奶牛都可以到达的牧场,就是要从奶牛所在位置开始遍历,求所有奶牛能重合的点的个数。解题思路:直接从从牛奶所在位置进行DFS,记录每个位置有奶牛能到的个数,个数等于奶牛总数的即合适的牧场。100分代码:#include<bi......
  • P2854 [USACO06DEC] Cow Roller Coaster S
    原题链接题解1.当没有花费限制的时候,我们可以将其抽象为简单的背包问题2.如果有了花费限制,那么我们就再加一维条件3.如果一个线段能用,那么它前面一定是铺满的,那我们令线段按起点排序,通过某种运算,保证放这个线段时,前面的线段组成是最优的比如在\(i\)点结尾位置花费\(j\)所......
  • P2850 [USACO06DEC] Wormholes G
    原题链接题解1.虫洞等价于建立负权边2.回到过去等价于存在负权环这里就相当于检测是否存在负权环,怎么判定呢?广搜,对于任意不含有负权环的,任意两点间的点数一定小于n如果存在负权环,那么搜索会一直沿着这个环进行下去,其路径的点数会大于ncode#include<bits/stdc++.h>usingna......
  • [USACO06DEC] Cow Picnic S
    P2853[USACO06DEC]CowPicnicS逆向思维如果顺着题目走,不大好做。考虑该题要求的是可以供所有奶牛到达的牧场,那么不如从奶牛所在的牧场下手即对每个奶牛所在的牧场\(DFS\),对所有到达点标记。那么显然当一个点的标记等于\(k\)时,说明该牧场是合适的。#include<iostream>......
  • picnic planning证明
    首先最终的答案一定包含最开始的T条边,不然的话,我们选择这T条边中没被包含的任意一条边,把它加入现有的生成树由于这T条边连接的是不同的连通块,所以加入这条边后生成树会形成一个环,而且这个环除了这一条边不包含其他任何一条这T条边中的一边又因为这T条边是最小的T条边,我们选择这......
  • 题解 UVA1537 Picnic Planning
    这道题在显然是最小生成树,但是很显然我是不会打最小生成树的。题意描述给定一张\(n\)个点\(m\)条边的无向图,求出无向图的一棵最小生成树,满足一号节点的度数不超过给定的整数\(s\)。具体思路首先,看到这种度数最多为\(s\)的题,显然想到wqs二分。但是wqs二分是恰好选......