MLE求调
查看原帖
MLE求调
1083512
17179__楼主2025/1/25 22:02

用的是优先队列的堆优化Dijkstra + 链式前向星

代码如下,我看不出这有任何MLE的可能啊...

#include <bits/stdc++.h>
using namespace std;

struct Med{
    int cost,positive,negative;
    Med(int cost,int positive,int negative):cost(cost),positive(positive),negative(negative){}
};
struct Edge{
    int to,cost;
    Edge(int to,int cost):to(to),cost(cost){}
};
typedef vector<Edge> ve;
typedef vector<Med> vm;
typedef vector<int> vi;

const int max_num_of_sym = 10,maxm = 1e3;
const int max_state = 1 << max_num_of_sym;
int d[max_state];
bool visited[max_state];
ve edges[max_state];
vm meds;

int get_bin_from_line(){
    string line;
    getline(cin,line);
    bitset<max_num_of_sym> b(line);
    return b.to_ulong();
}
int main(){
    #ifdef DEBUG
    freopen("in","r",stdin);
    #endif
    int t,n,m;
    cin >> t;
    while(t--){
        meds.clear();
        cin >> n >> m;
        getchar();
        int src_state = get_bin_from_line();
        for(int i = 0;i < m;i++){
            int cost;
            cin >> cost;
            getchar();
            int positive = get_bin_from_line(),negative = get_bin_from_line();
            meds.emplace_back(cost,positive,negative);
        }
        for(int state = 0;state < (1 << n);state++){
            edges[state].clear();
            for(int med_index = 0;med_index < m;med_index++){
                Med med = meds[med_index];
                int next_state = (state & (~med.positive)) | (med.negative);
                edges[state].emplace_back(next_state,med.cost);
            }
        }
        int dst_state = 0;
        memset(d,-1,sizeof(d));
        memset(visited,false,sizeof(visited));
        auto cmp = [](int x,int y){
            return d[x] > d[y];
        };
        priority_queue<int,vi,decltype(cmp)> Q(cmp);
        auto relax = [&](int state,int dist){
            d[state] = d[state] == -1 ? dist : min(dist,d[state]);
            Q.push(state);
        };
        relax(src_state,0);
        while(!Q.empty()){
            int state_now = Q.top();
            Q.pop();
            visited[state_now] = true;
            if(state_now == dst_state) break;
            for(int i = 0;i < edges[state_now].size();i++){
                Edge E = edges[state_now][i];
                if(visited[E.to] == false){
                    relax(E.to,d[state_now] + E.cost);
                }
            }
        }
        cout << d[dst_state] << endl;
    }
    return 0;
}
2025/1/25 22:02
加载中...