刚学OI第一次写紫题
查看原帖
刚学OI第一次写紫题
1807054
tianjianshuji楼主2025/7/21 15:52

新手第一次尝试紫题,不知道为什么错这么多,求调

#include<bits/stdc++.h>
using namespace std;
int n,m,p;
vector<int>g[16];
bool c(vector<bool>&s){
    int x=-1;
    for(int i=1;i<=n;i++)if(s[i]){x=i;break;}
    if(x==-1)return 1;
    vector<bool>v(n+1);
    queue<int>q;
    q.push(x);
    v[x]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int y:g[u])if(s[y]&&!v[y])v[y]=1,q.push(y);
    }
    for(int i=1;i<=n;i++)if(s[i]&&!v[i])return 0;
    return 1;
}
int main(){
    cin>>n>>m>>p;
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    long long r=0;
    for(int k=0;k<(1<<n);k++){
        vector<bool>s(n+1);
        int t=0;
        for(int i=1;i<=n;i++)if(k&(1<<(i-1)))s[i]=1,t++;
        if(!t){
            long long w=1;
            for(int i=0;i<m;i++)w=w*2%p;
            r=(r+w)%p;
            continue;
        }
        if(!c(s))continue;
        int f=0;
        for(int u=1;u<=n;u++){
            if(!s[u])continue;
            for(int y:g[u])if(y>u&&s[y])f++;
        }
        int e=m-f;
        long long w=1;
        for(int i=0;i<f;i++)w=w*2%p;
        for(int i=0;i<e;i++)w=w*2%p;
        r=(r+w)%p;
    }
    cout<<r;
}

每个军营两种状态,枚举所有状态复杂度2n,理论上可以过测试数据,不知道为什么全错了,希望有dalao能帮我改改

2025/7/21 15:52
加载中...