dijk求改。。。
查看原帖
dijk求改。。。
865793
better_Z楼主2024/10/7 14:03
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = (1<<21)-1;
int dis[MAXN],n,m,vis[MAXN];
char c;
struct node {
    int t,b1,b2,f1,f2;
}e[122];
struct E{
    int pos,w;
    friend bool operator<(E a,E b){
        return a.w<b.w;
    }
}tmp;
priority_queue<E>q;
void dijk(){
    memset(dis,0x3f,sizeof(dis));
    tmp.pos=0,tmp.w=0;
    dis[0]=0;
    q.push(tmp);
    while(!q.empty()){
        int now=q.top().pos;
        q.pop();
        if(vis[now])continue;
        vis[now]=1;
        for(int i=1;i<=n;i++){
            if((now&e[i].b2)==e[i].b2&&(now&e[i].b1)==0){
                int next_pos=(now|e[i].f1)^e[i].f2;
                if(dis[next_pos]>dis[now]+e[i].t){
                    dis[next_pos]=dis[now]+e[i].t;
                }
                tmp.pos=next_pos,tmp.w=dis[next_pos];
                q.push(tmp);
            }
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>e[i].t;
        for(int j=1;j<=n;j++){
            cin>>c;
            if(c=='+')e[i].b1+=1;
            if(c=='-')e[i].b2+=1;
            e[i].b1<<=1;
            e[i].b2<<=1;
        }
        for(int j=1;j<=n;j++){
            cin>>c;
            if(c=='+')e[i].f1+=1;
            if(c=='-')e[i].f2+=1;
            e[i].f1<<=1;
            e[i].f2<<=1;
        }
    }
    dijk();
    if(dis[(1<<n)-1]==1061109567)cout<<0;
    else cout<<dis[(1<<n)-1];
    cout<<dis[1];
    return 0;
}
2024/10/7 14:03
加载中...