JavaScript实现Div二级联动效果(响应键盘按钮)
2014-09-05 13:30
627 查看
LTC 男人八题之一,解题报告见09看论文。
#include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; int const N= 10010, inf= 0x7fffffff; int n, k, cnt, tot, root, size, nchild, first, last, pre, ans; int Fnum; struct Edge{ int adj, wt; Edge* next; }tb[N<<1]; Edge* mat ; int dist , flag , que , vis , num ; void inline add( int u, int v, int d ){ ++cnt; tb[cnt].adj= v; tb[cnt].wt= d; tb[cnt].next= mat[u]; mat[u]= tb+ cnt; ++cnt; tb[cnt].adj= u; tb[cnt].wt= d; tb[cnt].next= mat[v]; mat[v]= tb+ cnt; } int selectRoot( int rt ){ flag[rt]= Fnum; int tmp= 0, sum= 0; for( Edge* p= mat[rt]; p; p= p->next ){ int v= p->adj; if( vis[v]== 0 && flag[v]!= Fnum ){ int s= selectRoot( v ); if( s> tmp ) tmp= s; sum+= s; } } if( nchild- 1- sum> tmp ) tmp= nchild- 1- sum; if( tmp< size ){ size= tmp; root= rt; } return sum+ 1; } int inline getCount( int first, int last ){ sort( dist+ first, dist+ last+ 1 ); int head= first, tail= last, ret= 0; while( first< last ){ if( dist[first]+ dist[last]<= k ) ret+= last- first++; else last--; } return ret; } int dfs( int rt, int len ){ flag[rt]= Fnum; dist[++last]= len; int sum= 0; for( Edge* p= mat[rt]; p; p= p->next ) if( !vis[p->adj] && flag[p->adj]!= Fnum ){ int v= p->adj, wt= p->wt; sum+= dfs( v, len+ wt ); } num[rt]= sum+ 1; return sum+ 1; } void solve( int rt ){ pre= 1; for( Edge* p= mat[rt]; p; p= p->next ) if( !vis[p->adj] && flag[p->adj]!= Fnum ){ int v= p->adj, wt= p->wt; dfs( v, wt ); ans-= getCount( pre, last ); pre= last+ 1; } } int main(){ while( scanf("%d%d",&n,&k)!= EOF ){ if( n== 0 && k== 0 ) return 0; for( int i= 0; i<= n; ++i ) mat[i]= 0, flag[i]= 0, vis[i]= 0; cnt= -1; tot= -1; int u, v, d; for( int i= 1; i< n; ++i ){ scanf("%d%d%d", &u,&v,&d ); add( u, v, d ); } int head= 0, tail= 0; que[0]= 1; nchild= n; ans= 0; Fnum= 0; num[1]= n; while( head<= tail ){ int now= que[head++]; nchild= num[now]; Fnum++; size= 0x7fffffff; selectRoot( now ); vis[root]= 1; for( Edge*p= mat[root]; p; p= p->next ) if( !vis[p->adj] ) que[++tail]= p->adj; first= pre= 1; last= 0; Fnum++; solve( root ); dist[++last]= 0; ans+= getCount( first, last ); } printf("%d\n", ans ); } return 0; }
相关文章推荐
- 基于Javascript实现二级联动菜单效果
- JavaScript实现输入框与清空按钮联动效果
- javascript实现div浮动在网页最顶上并带关闭按钮效果实例
- javascript实现div浮动在网页最顶上并带关闭按钮效果实例
- javascript实现单击按钮使div变大效果
- 基于Javascript实现二级联动菜单效果
- 二级联动效果实现(在javascript中解析xml文件添加到html(select)中)
- javascript实现二级联动下拉框
- JavaScript实现二级、多级(N级)联动下拉列表框更新版(续)- 四级联动的演示
- JavaScript实现二级联动下拉框
- JavaScript 学习--二级联动菜单实现
- javascript实现二级联动下拉框
- ASP.NET利用JavaScript实现无刷新闪烁二级联动菜单
- javascript实现二级联动下拉框
- 屏蔽Button按钮对Enter回车键的响应 及实现Enter->Tab效果
- Javascript实现div的toggle效果小记及其它。
- 在一个jsp页面实现二级下拉框联动,实时读取数据库数据(用javascript实现)
- ASP.NET利用JavaScript实现无刷新闪烁二级联动菜单
- JavaScript实际应用:简单二级联动菜单实现
- 屏蔽Button按钮对Enter回车键的响应 及实现Enter->Tab效果