您的位置:首页 > 其它

bzoj1050

2016-03-08 15:02 441 查看
强行lct 打我呀。。

貌似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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: