日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

WJC上学记

發(fā)布時間:2024/4/24 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 WJC上学记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

WJC上學(xué)記
題目描述:
WJC為了追求YHY,決定考上樹人,但是,愚蠢的他沒有足夠好的成績,只能靠自己的親戚來幫忙。但是由于他足夠愚蠢,連自己的親戚都不認(rèn)識,仁慈而被樹人優(yōu)錄的Geek_du決定幫助他。WJC找了N(0<N<50000)個人,分別和他們進(jìn)行聊天,聊了E次(0<E<30000)。請幫助WJC找到一些人和他自己的最近公共祖先。

輸入說明:
輸入第一行包含兩個整數(shù),N和E。分別表示N個人和E次聊天。
以下E行每一行包含兩個整數(shù),A,B表示A是B的父輩。
再下面一行包含一個整數(shù)M,表明M次查詢。
下面M行每行包含兩個整數(shù),P,Q,詢問P和Q的最近公共祖先。

輸出說明:
對于每個查詢,給出他們的最近公共祖先。

樣例輸入:
4 3
1 2
2 3
2 4
1
3 4

樣例輸出:
2

數(shù)據(jù)范圍:
100%:0<N<5000,0<E<30000

LCA最近公共祖先模板題

/* ***********************************************
Author        :buaaasd
Created Time  :2016/1/23 19:48:00
File Name     :1.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 100000+10
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << 61;
const double eps=1e-5;
using namespace std;

bool cmp(int a,int b){
    return a>b;
}
int fa[maxn],n,m,pre[maxn],l;
int qpre[maxn];
int ans[maxn*10];
struct node{
    int v,next;
}edge[maxn+10];
struct Node{
    int qv,qnext,id;
}qedge[maxn*10];

void add(int u,int v){
    edge[l].v=v;
    edge[l].next=pre[u];
    pre[u]=l++;
}
void qadd(int u,int v,int id){
    qedge[l].qv=v;
    qedge[l].id=id;
    qedge[l].qnext=qpre[u];
    qpre[u]=l++;
}
int findfa(int x){
    if(x==fa[x])return x;
    else return fa[x]=findfa(fa[x]);
}
void Union(int x,int y){
    x=findfa(x);
    y=findfa(y);
    fa[y]=x;
}
void dfs(int u){
    int v;
    fa[u]=u;
    for(int i=pre[u];i+1;i=edge[i].next){
        v=edge[i].v;
        if(fa[v]==-1){
            dfs(v);
            Union(u,v);
        }
    }
    /*
    for(v=1;v<=n;v++){
        if(fa[v]!=-1){
            lca[u][v]=lca[v][u]=findfa(v);
        }
    }*/
    for(int i=qpre[u];i+1;i=qedge[i].qnext){
        v=qedge[i].qv;
        if(fa[v]!=-1){
            int id=qedge[i].id;
            ans[id]=findfa(v);
        }
    }
}
int main()
{
    #ifndef ONLINE_JUDGE
    //freopen("in.txt","r",stdin);
    #endif
    //freopen("out.txt","w",stdout);
    int x,y;
    while(cin>>n>>m){
        l=0;
        memset(fa,-1,sizeof fa);
        memset(pre,-1,sizeof pre);
        memset(qpre,-1,sizeof qpre);
        for(int i=1;i<=m;i++){
            cin>>x>>y;
            add(x,y);
        }
        l=0;
        int k;
        cin>>k;
        for(int i=1;i<=k;i++){
            scanf("%d%d",&x,&y);
            qadd(x,y,i);
            qadd(y,x,i);
        }
        dfs(1);
        for(int i=1;i<=k;i++){
            printf("%d
",ans[i]);
        }

    }
    return 0;
}

借鑒了網(wǎng)上的許多代碼,最后總結(jié)的模板。

這個博主寫的最清晰。https://comzyh.com/blog/archives/492/ 而且有圖真是極好的。

鏈?zhǔn)角跋蛐莗re[u]代表以u為起點的第一條邊的位置。edge[l].v存儲邊的終點。edge[l].next存儲下一條邊的位置。

總結(jié)

以上是生活随笔為你收集整理的WJC上学记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。