多校第十場 HDU 3938 Portal(離線的並查集)

來源:互聯網
上載者:User

題意:定義T是2點間某條路徑上的最大邊權,要找出某兩點間所有路徑上的T的最小值,給定一個L問,滿足小於等於L的min{T}的個數

 題出的挺坑爹的,讀半天沒讀懂啥意思。

達哥說是離線的並查集,大概就是用並查集來維護圖,根據邊權從小到大不斷往圖中加邊,新加的邊一定滿足是2點間的某路徑的最大值,若2點本身不在同一連通分量上,則這條邊就是所求的minT,滿足它的個數就是2個連通分量的定點個數的乘積。

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int maxq=10100;const int maxn=10100;const int maxm=50500;int p[maxn],rank[maxn],cnt[maxn];//for merge-find setsint index[maxq] , que[maxq] , ans[maxq];//for queryint ind[maxm] ;//for edgestruct Edge{    int u,v,w;}edge[maxm];int find (int x){    return p[x]==x?x:p[x]=find(p[x]);}int merge (int a,int b){    int fa=find (a);    int fb=find (b);    if(fa==fb)return 0;    int t=cnt[fa]*cnt[fb];    if(rank[fa]>rank[fb])p[fb]=fa,cnt[fa]+=cnt[fb],cnt[fb]=0;    else p[fa]=fb,cnt[fb]+=cnt[fa],cnt[fa]=0;    if(rank[fa]==rank[fb])rank[fb]++;    return t;}bool cmp1 (int a,int b){    return edge[a].w<edge[b].w;}bool cmp2 (int a, int b){    return que[a]<que[b];}int main (){    int n,m,q;    int u,v,w;    freopen ("in.in","r",stdin);    freopen ("out.txt","w",stdout);    while (~scanf("%d%d%d", &n,&m,&q))    {        for (int i=0 ; i<m ; ++i)        {            scanf("%d%d%d",&u,&v,&w);            u--,v--;            edge[i].u=u;edge[i].v=v;edge[i].w=w;            ind[i]=i;        }        for (int i=0 ; i<q ; ++i)        {            scanf("%d",que+i);            index[i]=i;        }        for (int i=0 ; i<n ; ++i)            rank[i]=0,p[i]=i,cnt[i]=1;        //memset (ans , 0 ,sizeof(ans));        int tmp=0;        sort (ind , ind+m , cmp1);        sort (index , index+q , cmp2);        for (int i=0 ,j=0; i<q ; ++i)        {            while (edge[ind[j]].w<=que[index[i]] && j<m)            {                tmp+=merge(edge[ind[j]].u,edge[ind[j]].v);                ++j;            }            ans[index[i]]=tmp;        }        for (int i=0 ; i<q ; ++i)        printf("%d\n",ans[i]);    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.