[bzoj1574][Usaco2009 Jan]地震损坏Damage_dfs

地震损坏Damage bzoj-1574 Usaco-2009 Jan

题目大意题目链接。

注释:略。


想法

显然对于每一个report点,和它直接相连的点都不可能到达1。我们将它打上标记。

然后爆搜。不搜经过的店,不搜标记的点。

显然,这样所有可以被到达的点都符合题意,用n减一下就行了。

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 30010 
#define M 100010 
int head[N],nxt[M<<1],to[M<<1],tot;
inline void add(int x,int y) {to[++tot]=y; nxt[tot]=head[x]; head[x]=tot;}
inline void Add(int x,int y) {add(x,y); add(y,x);}
bool cut[N];
bool vis[N];
void dfs(int pos)
{
	vis[pos]=1;
	for(int i=head[pos];i;i=nxt[i]) if(!cut[to[i]]&&!vis[to[i]])
	{
		dfs(to[i]);
	}
}
int main()
{
	int n,m,p;
	scanf("%d%d%d",&n,&m,&p);
	int a,b,x;
	for(int i=1;i<=m;++i)
	{
		scanf("%d%d",&a,&b);
		Add(a,b);
	}
	while(p--)
	{
		scanf("%d",&x);
		for(int i=head[x];i;i=nxt[i])
			cut[to[i]]=1;
	}
	dfs(1);
	int ans=n;
	for(int i=1;i<=n;++i)
		if(vis[i])
			--ans;
	printf("%d",ans);
	return 0;
}

小结:做问题时,如果已经得到了一种非常显然的结论,不要停止。尝试可不可能通过这个结论解出这个题或者直接得到更优美的结论。

原文地址:https://www.cnblogs.com/ShuraK/p/9669510.html