Codeforce 1296 F Berland Beauty

给一颗无根树,你要给每条边赋边权,满足每对a_ib_i的路径上最小边权为w_i

树上任意两点之间的路径可以知道的,我们把所有w按从大到小排序,然后把a到b的路径上的边没有赋边权的全设为w,已经有边权的不变,同时计算这条路径上最小边权minn,如果最后minn=w,证明赋权成功,否则失败。

w一定要从大到小,这样才能保证后来的 w_j 不会覆盖先前的 w_i 。如果把 w_i 覆盖成了 w_j ,那么之前 a_ib_i的路径上最小边权就不是w_i ,而是 w_j 了。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <cmath>
#include <set>
#define ms(a,b) memset(a,b,sizeof(a))
#define INF 1e6
#define pb push_back
using namespace std;
typedef long long ll;
typedef double db;
const int N=5e3+5;
struct node{int v,i;};
vector<node>tr[N];
int val[N],f[N],d[N],cnt[N],ans[N];
void dfs(int u,int fa)
{
    d[u]=d[fa]+1;
    f[u]=fa;
    for(int i=0;i<tr[u].size();i++)
    {
        int v=tr[u][i].v;
        if(v==fa) continue;
        dfs(v,u);
        cnt[v]=tr[u][i].i;
    }
    val[u]=INF;
}
bool work(int x,int y,int w)
{
    int minn=INF;
    if(d[x]<d[y]) swap(x,y);
    while(d[x]!=d[y])
    {
        if(val[x]==INF) val[x]=w;
        minn=min(minn,val[x]);
        x=f[x];
    }
    while(x!=y)
    {
        if(val[x]==INF) val[x]=w;
        minn=min(minn,val[x]);
        x=f[x];
        if(val[y]==INF) val[y]=w;
        minn=min(minn,val[y]);
        y=f[y];
    }
    return minn==w; 
}
struct ask
{
    int a,b,w;
    bool operator < (const ask A) const
    {return w<A.w;}
};
priority_queue<ask>q;
int main()
{
    int n,m;
    cin>>n;
    for(int i=1,u,v;i<n;i++)
    {
        cin>>u>>v;
        tr[u].pb({v,i});
        tr[v].pb({u,i});
    }  
    dfs(1,0);
    cin>>m;
    for(int i=0,a,b,w;i<m;i++)
    {
        cin>>a>>b>>w;
        q.push({a,b,w});
    }
    while(!q.empty())
    {
        ask tmp=q.top();
        q.pop();
        if(!work(tmp.a,tmp.b,tmp.w))
        {
            puts("-1");
            return 0;
        }
    }
    for(int i=2;i<=n;i++)
        ans[cnt[i]]=val[i];
    for(int i=1;i<n;i++)
        cout<<ans[i]<<" ";
    //system("pause");
}

猜你喜欢

转载自blog.csdn.net/Luowaterbi/article/details/104184392