bzoj1050
2016-03-08 15:02
441 查看
强行lct 打我呀。。
貌似bzoj数据不对? 有自环 (逃
貌似bzoj数据不对? 有自环 (逃
#include <cstdio> #include <algorithm> using namespace std; int ch[5510][2],fa[5510],rv[5510],x[5510],nu[5510],mi[5510],mn[5510]; int st[5510],tp; int n,m,ST,EN; int head[510]; struct edge { int u,v,w; bool operator < (const edge &b)const { return w < b.w; } }e[5010]; int read_int () { char c = getchar(); int re = 0; for(;c > '9' || c < '0';c = getchar()); for(;c >= '0' && c <= '9';c = getchar()) re = re * 10 + c - '0'; return re; } int find (int u) { if(head[u] == u) return u; return head[u] = find(head[u]); } void pu (int u) { mi[u] = x[u]; mn[u] = nu[u]; if(mi[u] > mi[ch[u][0]]) { mi[u] = mi[ch[u][0]]; mn[u] = mn[ch[u][0]]; } if(mi[u] > mi[ch[u][1]]) { mi[u] = mi[ch[u][1]]; mn[u] = mn[ch[u][1]]; } } void reverse (int u) { int t = ch[u][0]; ch[u][0] = ch[u][1]; ch[u][1] = t; rv[u] ^= 1; } void pd (int u) { if(!rv[u]) return; rv[u] = 0; reverse(ch[u][0]); reverse(ch[u][1]); } void rot (int u,int d) { ch[fa[u]][d ^ 1] = ch[u][d]; if(ch[u][d]) fa[ch[u][d]] = fa[u]; int t = fa[fa[u]]; fa[fa[u]] = u; ch[u][d] = fa[u]; fa[u] = t; pu(ch[u][d]); pu(u); if(!t) return; if(ch[t][0] == ch[u][d]) ch[t][0] = u; if(ch[t][1] == ch[u][d]) ch[t][1] = u; } void splay (int u) { st[tp = 1] = u; int t = u; while(ch[fa[t]][0] == t || ch[fa[t]][1] == t) { t = fa[t]; st[++tp] = t; } while(tp) pd(st[tp--]); while(ch[fa[u]][0] == u || ch[fa[u]][1] == u) { if(ch[fa[fa[u]]][0] != fa[u] && ch[fa[fa[u]]][1] != fa[u]) { if(ch[fa[u]][0] == u) rot(u,1); else rot(u,0); } else { int d = ch[fa[fa[u]]][0] == fa[u]; if(ch[fa[u]][d] == u) { rot(u,d ^ 1); rot(u,d); } else { rot(u,d); rot(u,d); } } } } void access (int u) { int v = 0; while(u) { splay(u); ch[u][1] = v; pu(u); v = u; u = fa[u]; } } void mtr (int u) { access(u); splay(u); reverse(u); } void link (int u,int v) { mtr(u); mtr(v); fa[v] = u; } void cut (int u,int v) { mtr(u); access(u); splay(v); fa[v] = 0; } int gcd (int a,int b) { if(a % b) return gcd(b,a % b); return b; } int main () { n = read_int(); m = read_int(); for(int i = 0;i <= n;++i) { head[i] = i; mi[i] = x[i] = 0x3f3f3f3f; } for(int i = 1;i <= m;++i) { e[i].u = read_int(); e[i].v = read_int(); e[i].w = read_int(); } ST = read_int(); EN = read_int(); sort(e + 1,e + 1 + m); int a1 = 0x3f3f3f3f,a2 = 1; for(int i = 1;i <= m;++i) { ////////////////////////////////////////////////////// this part is different if(e[i].u != e[i].v) { if(find(e[i].u) == find(e[i].v)) { mtr(e[i].u); access(e[i].v); splay(e[i].u); int t = mn[e[i].u]; cut(t + n,e[t].u); cut(t + n,e[t].v); } else head[find(e[i].u)] = find(e[i].v); x[i + n] = mi[i + n] = e[i].w; mn[i + n] = nu[i + n] = i; link(e[i].u,i + n); link(e[i].v,i + n); } //////////////////////////////////////////////////////////////////////////// if(find(ST) == find(EN)) { mtr(ST); access(EN); splay(ST); if((double)e[i].w / (double)mi[ST] < (double)a1 / (double)a2) { a1 = e[i].w / gcd(e[i].w,mi[ST]); a2 = mi[ST] / gcd(e[i].w,mi[ST]); } } } if(a1 == 0x3f3f3f3f) printf("IMPOSSIBLE\n"); else { if(a1 / a2 * a2 == a1) printf("%d\n",a1 / a2); else printf("%d/%d\n",a1,a2); } return 0; }
相关文章推荐
- springMVC框架访问web-inf下的jsp文件
- Log4j学习
- 安卓自定义的渐变TextView
- Windows7 安装.net framework 4.0 失败,错误HRESULT 0xc8000222解决办法
- WC2016狗牌滚粗记
- Model Thinking的几个模型杂记
- SmartSvn的使用
- shiro中多用户的登陆页面(multiple login pages)配置
- 连接池和 "Timeout expired"异常【转】
- 线程同步机制
- 我的fckeditor实践
- struts2 默认Action
- 读取assets文件
- MySQL 调编码
- Win7右键没有新建Word、excel、powerpoint
- 设备管理员功能介绍
- Android canvas.save()和canvas.restore()的理解
- CollectionFramework
- 20160308001 GridView的Sorting排序
- 监控工具TCPMon的使用方法