| 记录编号 |
285027 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
27.[WC 2006] 水管局长 |
最终得分 |
100 |
| 用户昵称 |
FoolMike |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
0.776 s |
| 提交时间 |
2016-07-20 16:14:31 |
内存使用 |
15.07 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
const int M=200010;
const int maxl=99999999;
int n,m,q,i,j,u,v,l,cnt,fa[N],up[N];
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
struct edge{
int f,t,l;
}w[M],W[M],w1[M];
int head[N],tail[N],next[M];
void add(int f,int t,int l){
static int cnt=0;
cnt++;w[cnt].f=f;w[cnt].t=t;w[cnt].l=l;
if (!head[f]) head[f]=tail[f]=cnt;
else tail[f]=next[tail[f]]=cnt;
cnt++;w[cnt].f=t;w[cnt].t=f;w[cnt].l=l;
if (!head[t]) head[t]=tail[t]=cnt;
else tail[t]=next[tail[t]]=cnt;
}
void remove(int f,int t){
int i=head[f];
while (w[i].t!=t) i=next[i];
swap(w[i],w[head[f]]);
head[f]=next[head[f]];
}
bool cmp(const edge &x,const edge &y){
return x.l<y.l;
}
bool check[M];
int f[N][N];
struct ask{
int k,x,y,ans;
}Q[M];
void dfs(int x){
for (int i=head[x];i;i=next[i])
if (!fa[w[i].t])
fa[w[i].t]=x,up[w[i].t]=w[i].l,dfs(w[i].t);
}
int len,lca,last,vis[N];
void LCA(int x,int y){
static int t=1;t++;
int a=x,b=y;
len=-maxl;
while (a) vis[a]=t,a=fa[a];
while (vis[b]!=t) b=fa[b];
lca=b;
while (x!=lca){
if (up[x]>len) len=up[x],last=x;
x=fa[x];
}
while (y!=lca){
if (up[y]>len) len=up[y],last=y;
y=fa[y];
}
}
int main()
{
freopen("tube.in","r",stdin);
freopen("tube.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
f[i][j]=maxl;
for (i=1;i<=m;i++){
scanf("%d%d%d",&W[i].f,&W[i].t,&W[i].l);
f[W[i].f][W[i].t]=f[W[i].t][W[i].f]=i;
}
for (i=1;i<=q;i++){
scanf("%d%d%d",&Q[i].k,&Q[i].x,&Q[i].y);
if (Q[i].k==2) check[f[Q[i].x][Q[i].y]]=1;
}
cnt=0;
for (i=1;i<=m;i++)
if (!check[i]) w1[++cnt]=W[i];
sort(w1+1,w1+cnt+1,cmp);
for (i=1;i<=n;i++) fa[i]=i;
memset(check,0,sizeof check);
for (i=1;i<=cnt;i++){
int a=find(w1[i].f),b=find(w1[i].t);
if (a!=b){
fa[b]=a;add(w1[i].f,w1[i].t,w1[i].l);
}
}
memset(fa,0,sizeof fa);
fa[1]=1;dfs(1);fa[1]=0;
for (i=q;i>0;i--)
if (Q[i].k==1){
LCA(Q[i].x,Q[i].y);Q[i].ans=len;
}
else{
LCA(Q[i].x,Q[i].y);
if (len<W[f[Q[i].x][Q[i].y]].l) continue;
remove(last,fa[last]);
remove(fa[last],last);
add(Q[i].x,Q[i].y,W[f[Q[i].x][Q[i].y]].l);
memset(fa,0,sizeof fa);
fa[1]=1;dfs(1);fa[1]=0;
}
for (i=1;i<=q;i++)
if (Q[i].k==1) printf("%d\n",Q[i].ans);
return 0;
}