【数位贪心】

【数位贪心】

十进制/二进制填数字
一般是从高位到低位考虑->继承

Minimum OR Path

https://atcoder.jp/contests/abc408/tasks/abc408_e

/*【贪心】最高位为0,次高位为0,...->从高位扫到低位 并继承高位的结果
【位数】设S:S中若存在i:所存在的边,第i位一定全是0
->从高位到低位:继承上一次的S,并把当位设成1(满足条件)
->如果能跑到n:说明该位是可以的 否则ans该位设为1
*/
const int N=2e5+10;
int n,m;
vector<PII> g[N];
bool st[N];
void dfs(int u,int fa,int x){
    st[u]=1;
    for(auto son:g[u]){
        int pos=son.first;
        int val=son.second;
        if(pos!=fa){       //该位及以前继承的位全为0
            if(!st[pos] && !(val&x)) dfs(pos,u,x);
        }
    }
}
void solve(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        g[u].push_back({v,w});
        g[v].push_back({u,w});
    }
    int s=0,ans=0;
    for(int i=29;i>=0;i--){
        memset(st,0,sizeof st);
        dfs(1,-1,s|(1<<i));
        if(st[n]) s|=(1<<i);
        else ans|=(1<<i);
    }
    cout<<ans<<endl;
}
posted @ 2025-06-01 23:01  White_ink  阅读(7)  评论(0)    收藏  举报