[P1967][NOIP2013]貨車運輸

原題鏈接

因爲數據比較水
根本沒用倍增
總之這個題就這麼水過去了
求最大生成樹
再求個LCA
參考鏈接戳這裏( • ̀ω•́ )✧

順便安利一個方法
tarjan求LCA
超好寫的
但是對這個題有點麻煩
參考地址戳這裏(◍´꒳`◍)

#include<iostream>
#include<cstdio>
#include<ctime>
#include<algorithm>
#include<climits>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<cmath>
#define LL long long
using namespace std;

struct nico
{
    int xx,yy,zz;
}ed[50005];
int cnt,w[100005],num[100005],nxt[100005],head[10005],f[10005],dep[10005],tot,n,m,dis[10005],fath[10005];
bool vis[10005];

void add(int p1,int p2,int val)
{
    cnt++;
    w[cnt]=val;
    num[cnt]=p2;
    nxt[cnt]=head[p1];
    head[p1]=cnt;
}

int find(int x)
{
    if(f[x]==x) return x;
    f[x]=find(f[x]);
    return f[x];
}

bool comp(nico a,nico b)
{
    return a.zz>b.zz;
}

void maxtree()
{
    int i,a,b;

    sort(ed+1,ed+m+1,comp);

    for(i=1;i<=m;i++)
    {
        a=find(ed[i].xx);
        b=find(ed[i].yy);

        if(a!=b)
        {
            f[a]=b;
            add(ed[i].xx,ed[i].yy,ed[i].zz);
            add(ed[i].yy,ed[i].xx,ed[i].zz);
            tot++;
            if(tot==n-1) break;         
        }   
    }
}

void dfs(int x)
{
    int i;

    vis[x]=1;

    for(i=head[x];i;i=nxt[i])
        if(!vis[num[i]])
        {
            dep[num[i]]=dep[x]+1;
            dis[num[i]]=w[i];
            fath[num[i]]=x;
            dfs(num[i]);
        }
}

int work(int p1,int p2)
{
    int m1=1000000,m2=1000000;

    if(dep[p1]<dep[p2]) swap(p1,p2);

    while(dep[p1]>dep[p2])
    {
        m1=min(m1,dis[p1]);
        p1=fath[p1];
    }

    while(p1!=p2)
    {
        m1=min(m1,dis[p1]);
        p1=fath[p1];        
        m2=min(m2,dis[p2]);
        p2=fath[p2];        
    }

    return min(m1,m2);
}


int main()
{
    int i,fx,fy,q,x,y;

    scanf("%d%d",&n,&m);

    for(i=1;i<=n;i++) f[i]=i;
    for(i=1;i<=m;i++) scanf("%d%d%d",&ed[i].xx,&ed[i].yy,&ed[i].zz);

    maxtree();

    for(i=1;i<=n;i++)
        if(!vis[i]) dfs(i);

    scanf("%d",&q);

    for(i=1;i<=q;i++)
    {
        scanf("%d%d",&x,&y);

        fx=find(x);fy=find(y);

        if(fx!=fy) printf("-1\n");
        else printf("%d\n",work(x,y));
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章