• P1967 货车运输


    P1967 货车运输
    最大生成树+lca+并查集

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<queue>
      4 #include<algorithm>
      5 #include<cmath>
      6 #include<ctime>
      7 #include<set>
      8 #include<map>
      9 #include<stack>
     10 #include<cstring>
     11 #define inf 2147483647
     12 #define For(i,a,b) for(register int i=a;i<=b;i++)
     13 #define p(a) putchar(a)
     14 #define g() getchar()
     15 //by war
     16 //2017.11.8
     17 using namespace std;
     18 int n,m,q;
     19 int x,y,z;
     20 int cnt;
     21 int Min[10010][15];
     22 int f[10010][15];
     23 int d[10010];
     24 int deep[10010];
     25 
     26 struct kru
     27 {
     28     int l,r,v;
     29     bool operator<(const kru&a)const
     30     {
     31         return v>a.v;
     32     }
     33 }E[50010];
     34 
     35 struct node
     36 {
     37     int n;
     38     int v;
     39     node *next;
     40 }*e[50010];
     41 
     42 inline void in(register int &x)
     43 {
     44     int y=1;
     45     char c=g();x=0;
     46     while(c<'0'||c>'9')
     47     {
     48     if(c=='-')
     49     y=-1;
     50     c=g();
     51     }
     52     while(c<='9'&&c>='0')x=(x<<1)+(x<<3)+c-'0',c=g();
     53     x*=y;
     54 }
     55 inline void o(register int x)
     56 {
     57     if(x<0)
     58     {
     59         p('-');
     60         x=-x;
     61     }
     62     if(x>9)o(x/10);
     63     p(x%10+'0');
     64 }
     65 
     66 inline int find(register int x)
     67 {
     68     if(d[x]==x)return x;
     69     d[x]=find(d[x]);
     70     return d[x];
     71 }
     72 
     73 inline void push(register int x,register int y,register int v)
     74 {
     75     node *p;
     76     p=new node();
     77     p->n=y;
     78     p->v=v;
     79     if(e[x]==NULL)
     80     e[x]=p;
     81     else
     82     {
     83         p->next=e[x]->next;
     84         e[x]->next=p;
     85     }
     86 }
     87 
     88 inline void build(register int now)
     89 {
     90     deep[now]=deep[f[now][0]]+1;
     91     for(register int i=1;(1<<i)<=n;i++)
     92     {
     93         Min[now][i]=min(Min[now][i-1],Min[f[now][i-1]][i-1]);
     94         f[now][i]=f[f[now][i-1]][i-1];
     95     }
     96     for(node *i=e[now];i!=NULL;i=i->next)
     97     {
     98         if(i->n!=f[now][0])
     99         {
    100             f[i->n][0]=now;
    101             Min[i->n][0]=i->v;
    102             build(i->n);
    103         }
    104     }
    105 }
    106 
    107 int query(int x,int y)
    108 {
    109     int MIN=inf;
    110     if(deep[x]<deep[y])
    111     swap(x,y);
    112     int c=deep[x]-deep[y];
    113     for(register int i=0;(1<<i)<=c;i++)
    114     if((1<<i)&c)
    115     {
    116     MIN=min(MIN,Min[x][i]);
    117     x=f[x][i];    
    118     }
    119     if(x==y)
    120     return MIN;
    121     c=log2(deep[x]);
    122     for(register int i=c;i>=0;i--)
    123     {
    124         if(f[x][i]!=f[y][i])
    125         {
    126             MIN=min(MIN,Min[x][i]);
    127             MIN=min(MIN,Min[y][i]);
    128             x=f[x][i];
    129             y=f[y][i];
    130         }
    131     }
    132     return min(MIN,min(Min[y][0],Min[x][0]));
    133 }
    134 
    135 int main()
    136 {
    137     in(n),in(m);
    138     For(i,1,n)
    139     d[i]=i;
    140     For(i,1,m)
    141     in(E[i].l),in(E[i].r),in(E[i].v);
    142     sort(E+1,E+m+1);
    143     For(i,1,m)
    144     {
    145         if(find(E[i].l)!=find(E[i].r))
    146         {
    147             d[find(E[i].l)]=find(E[i].r);
    148             cnt++;
    149             push(E[i].l,E[i].r,E[i].v);
    150             push(E[i].r,E[i].l,E[i].v);
    151         }
    152         if(cnt==n-1)
    153         break;
    154     }
    155     Min[1][0]=inf;
    156     build(1);
    157     in(q);
    158     For(i,1,q)
    159     {
    160         in(x),in(y);
    161         if(find(x)!=find(y))
    162         o(-1),p('
    ');
    163         else
    164         o(query(x,y)),p('
    ');
    165     }
    166      return 0;
    167 }
  • 相关阅读:
    复杂分组查询 查询订单数量和订单总金额 根据国家分组
    left join 连接之后 where条件字段为空 解决办法
    virtual Box 搭建 centOS 步骤(优化卡顿设置)(卡、卡、卡)
    Redis学习Redis的应用场景
    C#设计模式2创建型模式2.4 抽象工厂模式(Abstract Factory Pattern)
    Redis学习Redis的高频面试题
    Redis学习.AspNet Core项目实际应用
    C#设计模式2创建型模式2.5 建造者模式(Builder Pattern)
    C#设计模式2创建型模式2.2简单工厂模式(Factory Method Pattern)
    C#设计模式2创建型模式2.6原型模式(Prototype Pattern)
  • 原文地址:https://www.cnblogs.com/war1111/p/7807667.html
Copyright © 2020-2023  润新知