Gym 101572 D- 多源bfs- Distinctive Character

来源:互联网 发布:slack软件应用 编辑:程序博客网 时间:2024/05/21 14:00

https://vjudge.net/problem/1131041/origin
异或操作也没想到。这样算路径很方便。
改动一个dis+1

#include <iostream>#include <bits/stdc++.h>using namespace std;/* 思路是广搜,完全没有想到。  发现这道题的解空间 就在 0-pow(2,n)中。  而从很多地方一起 bfs的话,先到达的必然是最小的  (每次更新一个操作,算作距离)  并且这是多源 bfs,是从很多点bfs。  最后得到的结果肯定是 最长的。*/queue<int>q;char a[300];int dis[(1<<21)];int main(){   int m,n;memset(dis,-1,sizeof(dis));    scanf("%d%d",&m,&n);    for(int i=0;i<m;i++){        scanf(" %s",a);        int num=0;        for(int j=0;j<n;j++){            if(a[j]=='1')                num|=(1<<j);        }        //cout<<num<<endl;        q.push(num);        dis[num]=0;    }    int rel;    while(!q.empty()){          int u=q.front();          q.pop();          for(int i=0;i<n;i++){             int ans=u^(1<<i);             if(dis[ans]!=-1) continue;             dis[ans]=dis[u]+1;             rel=ans;             q.push(rel);          }    }    //cout<<rel<<endl;    for(int i=0;i<n;i++){        if(i==0){        if((rel&(1<<i)))            printf("1");        else            printf("0");        }        else{        if((rel&(1<<i)))            printf("1");        else            printf("0");            }    }    printf("\n");    return 0;}`这里写代码片`
原创粉丝点击