UVALive 8196 && Gym 101889I Imperial roads(最小生成树+LCA)

题目:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=6218

题意:给出一个图,再给出q次询问,每次询问包含一条边,求出含这条边的最小生成树的权值

先求一遍最小生成树,对于每一次询问,假如这一条边在最小生成树上边那就无所谓了,如果不在的话,就求出这条边的两个点之间的边的最大值,将其去掉,换上我们要加的边即可,找出这两点间边的最大值用lca即可实现

#include
#include
#include
#include
#include
using namespace std;
const int maxm=2e5+7;
const int maxn=1e5+7;
typedef pair P;
struct LDJ
{
    int u;
    int v;
    int val;
}node[maxm];
struct Node
{
    int to;
    int val;
    int next;
}edge[maxm<<1];
int n,m;
int cnt;
int head[maxn];
int tree[maxn];
int dep[maxn];
bool vis[maxn];
int par[maxn][110];
int maxx[maxn][110];
map ma;
void init()
{
    cnt=0;
    memset(head,-1,sizeof(head));
    memset(par,-1,sizeof(par));
    memset(vis,false,sizeof(vis));
    memset(dep,-1,sizeof(dep));
    memset(maxx,-1,sizeof(maxx));
    for(int i=0;i=0;i--)
    {
        if(par[x][i]!=par[y][i])
        {
            ans=max(ans,maxx[x][i]);
            ans=max(ans,maxx[y][i]);
            x=par[x][i];
            y=par[y][i];
        }
    }
    ans=max(ans,maxx[x][0]);
    ans=max(ans,maxx[y][0]);
    return ans;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        init();
        for(int i=0;i

 

你可能感兴趣的:(图论)