60pts hack数据均过求调
查看原帖
60pts hack数据均过求调
218172
BiaxialRay楼主2024/9/16 20:39
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
#define ll long long
const int Maxn = 1550,Maxm = 6e5 + 50;
const int INF = 0x7f7f7f7f;
int n,m,s1,e1,s2,e2;
int vis[Maxn],dir[Maxn][Maxn][5],map[Maxn][Maxn],min_t[Maxn][5],time[5],head[Maxn],indeg[Maxn],ans[Maxn][5],vis1[Maxn][Maxn],judge[Maxn],head1[Maxn][5],indeg1[Maxn][5];

int max(int x,int y){
    return x > y ? x : y;
}

struct Side{
    int w;
    int e;
    int next;
    int last;
    Side(){
        next = 0;
        last = 0;
    }
}side[Maxm],side1[Maxm][5];

void add(int s,int e,int w,int t){
    side[t].w = w;
    side[t].e = e;
    side[t].next = head[s];
    side[head[s]].last = t;
    head[s] = t;
}

void del(int x,int s){
    if(x == head[s]){
        head[s] = side[x].next;
    }else{
        side[side[x].last].next = side[x].next;
    }
}

struct Node{
    int w;
    int e;
    int operator < (const Node &x) const &{
        return x.w < w;
    }
};

priority_queue<Node> Q;

void dijkstra(int s,int x){
    int i,t;
    Node cur;
    memset(vis,0,sizeof(vis));
    Q.push((Node){0,s});
    while(!Q.empty()){
        cur = Q.top();
        Q.pop();
        t = cur.e;
        if(vis[t])continue;
        vis[t] = 1;
        for(i = head[t];i;i = side[i].next){
            if(min_t[side[i].e][x] > min_t[t][x] + side[i].w){
                min_t[side[i].e][x] = min_t[t][x] + side[i].w;
                if(!vis[side[i].e]){
                    Q.push((Node){min_t[side[i].e][x],side[i].e});
                }
            }
        }
    }
}

queue<int> Q1;
void clear(){
    while(!Q1.empty())Q1.pop();
}

void Set(int s){
    memset(vis,0,sizeof(vis));
    memset(indeg,0,sizeof(indeg));
    clear();
    Q1.push(s);
    int i,cur;
    while(!Q1.empty()){
        cur = Q1.front();
        Q1.pop();
        if(vis[cur])continue;
        vis[cur] = 1;
        for(i = head[cur];i;i = side[i].next){
            if(!vis[side[i].e]){
                ++indeg[side[i].e];
                Q1.push(side[i].e);
            }
        }
    }
}

void add1(int s,int e,int w,int t,int f){
    side1[t][f].w = w;
    side1[t][f].e = e;
    side1[t][f].next = head1[s][f];
    head1[s][f] = t;
    indeg1[e][f] += 1;
}

void Topsort1(int s){
    Set(s);
    int i,cur,cnt1 = 0,cnt2 = 0;
    clear();
    Q1.push(s);
    while(!Q1.empty()){
        cur = Q1.front();
        Q1.pop();
        for(i = head[cur];i;i = side[i].next){
            --indeg[side[i].e];
            if(!indeg[side[i].e])Q1.push(side[i].e);
            if(vis1[cur][side[i].e])continue;
            vis1[cur][side[i].e] = 1;
            vis1[side[i].e][cur] = 1;
            if((side[i].w + min_t[cur][0] + min_t[side[i].e][2] == time[1]) && side[i].w + min_t[cur][1] + min_t[side[i].e][3] == time[2]){
                ++cnt1;
                add1(cur,side[i].e,side[i].w,cnt1,1);
            }
            if((side[i].w + min_t[cur][0] + min_t[side[i].e][2] == time[1]) && side[i].w + min_t[side[i].e][1] + min_t[cur][3] == time[2]){
                ++cnt2;
                add1(cur,side[i].e,side[i].w,cnt2,2);
            }
        }
    }
}

void Topsort2(int f){
    int i,cur;
    clear();
    for(i = 1;i <= n;++i){
        if(!indeg1[i][f])Q1.push(i);
    }
    while(!Q1.empty()){
        cur = Q1.front();
        Q1.pop();
        for(i = head1[cur][f];i;i = side1[i][f].next){
            ans[side1[i][f].e][f] = max(ans[side1[i][f].e][f],ans[cur][f] + side1[i][f].w);
            --indeg1[side1[i][f].e][f];
            if(!indeg1[side1[i][f].e][f]){
                Q1.push(side1[i][f].e);
            }
        }
    }
}

int main(){
    int i,j,t1,t2,t3,top,res = 0;
    scanf("%d %d",&n,&m);
    scanf("%d %d %d %d",&s1,&e1,&s2,&e2);
    for(i = 1;i <= n;++i){
        min_t[i][0] = INF;
        min_t[i][1] = INF;
        min_t[i][2] = INF;
        min_t[i][3] = INF;
    }
    min_t[s1][0] = 0;
    min_t[s2][1] = 0;
    min_t[e1][2] = 0;
    min_t[e2][3] = 0;
    for(i = 0;i < m;++i){
        scanf("%d %d %d",&t1,&t2,&t3);
        add(t1,t2,t3,i*2+1);
        add(t2,t1,t3,i*2+2);
    }
    dijkstra(s1,0);
    dijkstra(s2,1);
    dijkstra(e1,2);
    dijkstra(e2,3);
    time[1] = min_t[e1][0];
    time[2] = min_t[e2][1];
    memset(vis1,0,sizeof(vis1));
    Topsort1(s1);
    memset(vis1,0,sizeof(vis1));
    Topsort2(1);
    Topsort2(2);
    for(i = 1;i <= n;++i){
        res = max(res,max(ans[i][1],ans[i][2]));
    }
    printf("%d",res);
    scanf("%d %d",&n,&m);
    return 0;
}

/*
9 9
1 6 4 9
1 2 1
2 3 9
3 4 1
3 5 1
5 6 1
5 7 1
8 7 2
2 8 7
8 9 1

3
*/
2024/9/16 20:39
加载中...