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");
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章