为什么会 MLE 啊
查看原帖
为什么会 MLE 啊
225100
LargeRice16pro楼主2024/4/8 22:21

我觉得这个空间(状态数)是 O(m)O(m) 的啊。

#include<bits/stdc++.h>
// #pragma GCC optimize ("O2")
#define ldb long double 
#define For(i,a,b) for(i=a;i<=b;i++)
#define FOR(i,a,b) for(i=a;i>=b;i--)
using namespace std;
const int N=2e5+10;
struct Edge{
    int v,col,id;
};
std::vector<Edge> p[N];
int dis[N],inf;
void add(int u,int v,int col,int id){
    p[u].push_back({v,col,id});
    p[v].push_back({u,col,id});
}
int n,m,s,t;
struct node{
    int x,dis,col,id;
};
bool vis[N];
void solve(){
    int i;
    For(i,1,n) dis[i]=inf;
    dis[s]=0;
    deque<node> q;
    q.push_back({s,0,0,0});
    while(q.size()){
        auto now=q.front();
        q.pop_front();
        if(vis[now.id]) continue;
        vis[now.id]=1;
        for(auto u:p[now.x]){
            int d=(u.col!=now.col);
            if(now.dis+d<=dis[u.v]){
                if(now.id+d==dis[u.v]&&vis[u.id]) continue;
                dis[u.v]=min(dis[u.v],now.dis+d);
                if(d)
                    q.push_back({u.v,now.dis+d,u.col,u.id});
                else
                    q.push_front({u.v,now.dis,u.col,u.id});
            }
        }
    }
    cout<<dis[t]<<'\n';
    For(i,0,m) vis[i]=0;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    memset(dis,0x3f,sizeof dis);
    inf=dis[0];
    int i,T;
    cin>>T;
    while(T--){
        cin>>n>>m;
        For(i,1,m){
            // cout<<i<<'\n';
            int u,v,col;
            cin>>u>>v>>col;
            add(u,v,col,i);
        }
        cin>>s>>t; 
        solve();
        For(i,1,n) p[i].clear();
    }
    return 0;
}
2024/4/8 22:21
加载中...