[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; }
小结:做问题时,如果已经得到了一种非常显然的结论,不要停止。尝试可不可能通过这个结论解出这个题或者直接得到更优美的结论。
| 欢迎来原网站坐坐! >原文链接<