[POI2013]Tower Defense Game
2018-03-30 15:27
218 查看
题目大意:
一个$n(n\le5\times10^5)$个点$m(m\le10^6)$条边的无向图,边权全为$1$,满足若一个标记点能覆盖与其距离不超过$1$的点,从中选取不超过$k$个点能将整张图覆盖。问若一个标记点能覆盖与其距离不超过$2$的点,求构造一种选取点数不超过$k$的方案将整张图覆盖。
思路:
贪心,每次选取没有覆盖的点作为标记点,并更新覆盖点的和。选取一个点后增加的覆盖范围一定完全包含原来覆盖这个点的标记点的覆盖范围,因此方案一定更优。
#include<cstdio> #include<cctype> inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x; } const int N=5e5+1,M=2e6+1; bool b ,vis ; int h ,ans ; struct Edge { int to,next; }; Edge e[M]; inline void add_edge(const int &u,const int &v) { e[++h[0]]=(Edge){v,h[u]};h[u]=h[0]; e[++h[0]]=(Edge){u,h[v]};h[v]=h[0]; } int main() { const int n=getint(),m=getint(),k=getint(); for(register int i=0;i<m;i++) { add_edge(getint(),getint()); } for(register int x=1;x<=n;x++) { if(vis[x]) continue; ans[++ans[0]]=x; vis[x]=b[x]=true; for(register int i=h[x];i;i=e[i].next) { const int &y=e[i].to; if(b[y]) continue; vis[y]=true; for(register int i=h[y];i;i=e[i].next) { const int &z=e[i].to; vis[z]=true; } } } printf("%d\n",ans[0]); for(register int i=1;i<=ans[0];i++) { printf("%d%c",ans[i]," \n"[i==ans[0]]); } return 0; }
相关文章推荐
- BZOJ3426 Poi2013 Tower Defense Game
- BZOJ3426: Poi2013 Tower Defense Game
- [AndEngine] GameSourceCode: Simple Tower Defense
- some helpfuf web sit about tower defense game
- 【hihoCoder】Tower Defense Game
- hiho一下 第109周 Tower Defense Game 树DP+贪心
- hiho一下第109周《Tower Defense Game》
- hihocoder Tower Defense Game(树上贪心)
- hihocoder1199 Tower Defense Game(树形dp)
- 微软hiho上的笔试题:Tower Defense Game
- hiho一下 第109周:Tower Defense Game
- 【POI2013】bzoj3426 Tower Defence Game
- hihoCoder #1199 Tower Defense Game
- HDU 4939 Stupid Tower Defense dp
- HDU4939 Stupid Tower Defense
- HDU 4939 Stupid Tower Defense(dp+贪心)
- [HDOJ 4939] Stupid Tower Defense [动态规划]
- 【HDU】4939 Stupid Tower Defense 【dp】
- HDU 4939 Stupid Tower Defense
- 寻路算法:模仿Tower Defense Flash做了一个小游戏