TLE 求助
查看原帖
TLE 求助
317568
AuKr楼主2020/6/28 21:41

Rt

#include"iostream"
#include"cstdio"
#include"cmath"
#include"algorithm"
#include"cstring"
using namespace std;

#define read(x) scanf("%d",&x)
#define MAXN 50005
#define inf 2147483647

int n,m,q;
struct node
{
    int x,y,z;
}ed[MAXN];
struct edge
{
    int to,nxt,w;
}e[MAXN<<1];
int head[MAXN],cnt=0,c=0;
int f[MAXN],fat[MAXN];
int tot[MAXN],son[MAXN];
int t[MAXN],vis[MAXN];
int cntt=0,topf[MAXN],id[MAXN];
int dis[MAXN],dep[MAXN];
struct Tree
{
    int maxn,l,r;
}a[MAXN<<2];
int x,y;

inline void update(int k){a[k].maxn=min(a[k<<1].maxn,a[k<<1|1].maxn);}

void build(int k,int l,int r)
{
    a[k].l=l,a[k].r=r;
    if(l==r){a[k].maxn=t[l];return;}
    int mid=(l+r)>>1;
    build(k<<1,l,mid),build(k<<1|1,mid+1,r);
    update(k);
    return;
}

int query(int k,int l,int r)
{
    if(l>r) return inf;
    if(a[k].l==l&&a[k].r==r) return a[k].maxn;
    int mid=(a[k].l+a[k].r)>>1;
    if(r<=mid) return query(k<<1,l,r);
    else if(l>mid) return query(k<<1|1,l,r);
    else return min(query(k<<1,l,mid),query(k<<1|1,mid+1,r));
}

void add(int u,int v,int w)
{
    e[++cnt].to=v;
    e[cnt].w=w;
    e[cnt].nxt=head[u];
    head[u]=cnt;
}

void init(int n){for(int i=1;i<=n;i++) f[i]=i;}
int getf(int u){return f[u]=(f[u]==u)?u:getf(f[u]);}
bool merge(int u,int v){int t1=getf(u),t2=getf(v);if(t1!=t2){f[t2]=t1;return true;}else return false;}

bool cmp(node n,node m){return n.z>m.z;}

int dfs1(int cur,int fa,int deep)
{
    vis[cur]=1;
    fat[cur]=cur;
    tot[cur]=1;
    dep[cur]=deep;
    int maxson=0;
    for(int i=head[cur];i;i=e[i].nxt)
    {
        int j=e[i].to;
        if(j==fa) continue;
        tot[cur]+=dfs1(j,cur,deep+1);
        if(maxson<tot[j]) maxson=tot[j],son[cur]=j,dis[cur]=e[i].w;
    }
    return tot[cur];
}

void dfs2(int cur,int fa,int top,int lng)
{
	vis[cur]=1;
    topf[cur]=top;
    if(fa!=cur) cntt++,id[cur]=cntt,t[cntt]=lng;
    else cntt++,id[cur]=cntt,t[cntt]=inf; 
	if(!son[cur]) return;
    dfs2(son[cur],cur,top,dis[cur]);
    for(int i=head[cur];i;i=e[i].nxt)
    {
        int j=e[i].to;
        if(!vis[j]) dfs2(j,cur,j,e[i].w); 
    }
    return;
}

int work(int x,int y)
{
    if(getf(x)!=getf(y)) return -1;
    int ans=inf;
    while(topf[x]!=topf[y])
    {
        if(dep[topf[x]]<=dep[topf[y]]) swap(x,y);
        ans=min(ans,query(1,id[topf[x]],id[x]));
        x=fat[topf[x]];
    }
    if(dep[x]>dep[y]) swap(x,y);
    if(x==y) return ans;
    else return ans=min(ans,query(1,id[son[x]],id[y]));
}

int main()
{
    read(n),read(m);
    for(int i=1;i<=m;i++) read(ed[i].x),read(ed[i].y),read(ed[i].z);
    sort(ed+1,ed+1+m,cmp),init(n);
    for(int i=1;i<=m;i++)
    {
        if(merge(ed[i].x,ed[i].y))
        {
            c++;
            add(ed[i].x,ed[i].y,ed[i].z),add(ed[i].y,ed[i].x,ed[i].z);
            if(c==n-1) break;
        }
    }
    for(int i=1;i<=n;i++) if(!vis[i]) fat[i]=i,dfs1(i,0,1);
    memset(vis,0,sizeof(vis)); 
	for(int i=1;i<=n;i++) if(!vis[i]) dfs2(i,i,i,0);
    build(1,1,cntt);
    read(q);
    while(q--)
    {
        read(x),read(y);
        printf("%d\n",work(x,y));
    }
    return 0;
}
2020/6/28 21:41
加载中...