2 条题解

  • 1
    @ 2023-1-29 15:35:52

    tarjan

    #include<bits/stdc++.h>
    using namespace std;
    int n,q,rt,ans[100001];
    //n:点数 q:问题数 rt:根  ans[i]:第i个问题的结果
    struct upp{
    	int tu,yu;
    };
    vector<upp> e[100001];//问题记录 
    vector<upp> a[100001];
    int de[100001];//距根节点距离 
    int fa[100001];
    int fi(int x)
    {
        if(fa[x]==x)
            return x;
        return fa[x]=fi(fa[x]);
    }
    void sbga(int n,int u,int f)//n:这一个 u:上一个 f:距顶点距离 
    {
    	de[n]=f;//记录n距根节点距离 
    	for(int i=0;i<e[n].size();i++) 
    	{
    		int too=e[n][i].tu;//n --> too 
    		int nowe=e[n][i].yu;//nowe:问题编号 
    		if(de[too]!=-1)
    		{
    			int w=fi(too);
    			if(ans[nowe]==-1)
    				ans[nowe]=de[n]+de[too]-2*de[w];
    		}
    	}
    	for(int i=0;i<a[n].size();i++)
    	{
    		int nxt=a[n][i].tu;// nxt:下一个 
    		int nxfar=a[n][i].yu;//nxfar:距下一个距离 
    		if(nxt==u)
    			continue;
    		if(de[nxt]==-1)
    			sbga(nxt,n,f+nxfar);
    		fa[nxt]=n;
    	}
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n>>q;
        for(int i=1;i<=n-1;i++)
        {
        	int x,y,z;
        	cin>>x>>y>>z;
        	a[x].push_back((upp){y,z});
        	a[y].push_back((upp){x,z});
        	rt=y;
    	}
    	memset(de,-1,sizeof(de));
    	memset(ans,-1,sizeof(ans));
    	de[rt]=0;
    	for(int i=1;i<=n;i++)
    		fa[i]=i;
    	for(int i=1;i<=q;i++)
    	{
    		int x,y;
    		cin>>x>>y;
    		if(x==y)
    			ans[i]=0;
    		e[x].push_back((upp){y,i});
    		e[y].push_back((upp){x,i});
    	}
    	sbga(rt,0,0);
    	for(int i=1;i<=q;i++)
    		cout<<ans[i]<<"\n";
        return 0;
    }
    

    信息

    ID
    786
    时间
    1000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    39
    已通过
    19
    上传者