BZOJ4316: 小C的独立集
2016-01-16 17:14
330 查看
很裸的仙人掌DP (奇怪的是没有人来做
这是第一次独自打仙人掌DP
打的时候可能因为思路比较清晰 然后只有一个low打错了
然后需要说的是po姐貌似程序有问题。。我的一个小数据他就坏了。。
9 9
2 3
3 4
4 2
5 6
6 3
7 8
8 2
9 2
1 3
就是这个。。。
这是第一次独自打仙人掌DP
打的时候可能因为思路比较清晰 然后只有一个low打错了
然后需要说的是po姐貌似程序有问题。。我的一个小数据他就坏了。。
9 9
2 3
3 4
4 2
5 6
6 3
7 8
8 2
9 2
1 3
就是这个。。。
#include<cstdio> #include<iostream> #include<cstring> using namespace std; struct Chain { Chain *next; int u; Chain(){ next=NULL; } }*Head[100001]; inline void addside(int a,int b) { Chain *tp=new Chain; tp->u=b; tp->next=Head[a]; Head[a]=tp; } int F[100001][3]; int Out_Cir[100001][3]; int Stack[100001]; int low[100001],f[100001],deep[100001],now[100001]; int cnt; int f_DP[100001][3]; inline void DP(int root,int low) { int n=1; Stack[0]=root; Stack[1]=low; while(true) { if(Stack ==root)break; Stack[n+1]=f[Stack[n++]]; } //root buqu int Old[3]; f_DP[0][0]=f_DP[0][1]=0; for(int i=1;i<=n;i++) f_DP[i][1]=f_DP[i-1][0]+Out_Cir[Stack[i]][1], f_DP[i][0]=max(f_DP[i-1][0],f_DP[i-1][1])+Out_Cir[Stack[i]][0]; Old[0]=f_DP [0]; //qu f_DP[0][0]=-(1<<29); for(int i=1;i<=n;i++) f_DP[i][1]=f_DP[i-1][0]+Out_Cir[Stack[i]][1], f_DP[i][0]=max(f_DP[i-1][0],f_DP[i-1][1])+Out_Cir[Stack[i]][0]; Old[1]=f_DP [1]; Out_Cir[root][1]=Old[1]; Out_Cir[root][0]=Old[0]; } void DFS(int u) { low[u]=now[u]=++cnt; Out_Cir[u][1]=1; Out_Cir[u][0]=0; if(u==28) u++,u--; for(Chain *tp=Head[u];tp;tp=tp->next) if(tp->u!=f[u]) { if(deep[tp->u]) low[u]=min(low[u],now[tp->u]); else { f[tp->u]=u; deep[tp->u]=deep[u]+1; DFS(tp->u); if(low[tp->u]>now[u]) Out_Cir[u][1]+=Out_Cir[tp->u][0], Out_Cir[u][0]+=max(Out_Cir[tp->u][1],Out_Cir[tp->u][0]); low[u]=min(low[u],low[tp->u]); } } if(u==17) u++,u--; for(Chain *tp=Head[u];tp;tp=tp->next) if(tp->u!=f[u]&&low[tp->u]==now[u]&&deep[tp->u]!=deep[u]+1) DP(u,tp->u); } char c; inline void read(int &a) { a=0;do c=getchar();while(c<'0'||c>'9'); while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar(); } int main() { int n,m; read(n),read(m); while(m--) { int i,j; read(i),read(j); addside(i,j); addside(j,i); } deep[1]=1; f[1]=1; DFS(1); printf("%d\n",max(Out_Cir[1][0],Out_Cir[1][1])); return 0; }
相关文章推荐
- 什么是面向对象
- 【源代码】LinkedHashMap源代码剖析
- 全局大喇叭,广播机制初篇。
- 访问注解与自定义注解
- 在Ubuntu下安装nodejs4.x,并实现开机自动启动forever进程守护nodejs应用后台运行
- lightoj 1017 - Brush (III)
- 最近买了个Mac Pro,用起来感觉是去年买了个表
- 身为DATASHUO大数据工程师,我亲手制作的2016年第一期数据报告
- 首次启动
- Open Panel as ToolStrip MenuItem after click on menu C#
- 微信创建自定义菜单和删除自定义菜单
- hdu1082 Matrix Chain Multiplication
- 使用ViewGrop和Fragment对Fragmen进行缓存
- Android性能优化之Splash页应该这样设计
- java byte【】数组与文件读写(增加新功能)
- ASIHTTPRequest -- 断点续传
- ubuntu配置全局环境变量后开新shell变量无效的解决方法
- 正则表达式、扩展表达式以及相关实战
- Spark Streaming使用Kafka保证数据零丢失
- React-Native学习指南