dijkstra+堆优化+前向星 TLE第10个点 请问有人能帮帮忙吗?谢谢!
  • 板块P1186 玛丽卡
  • 楼主theHermit
  • 当前回复8
  • 已保存回复8
  • 发布时间2020/10/12 15:59
  • 上次更新2023/11/5 10:56:11
查看原帖
dijkstra+堆优化+前向星 TLE第10个点 请问有人能帮帮忙吗?谢谢!
257348
theHermit楼主2020/10/12 15:59

pre数组用来存路径

然后先预处理最短路

再枚举删掉最短路上的每条边再dijkstra,求每次1->n的最大值

可是即使这样还是TLE...

PS :有快读

请各位帮忙看看吧,谢谢!

#include<bits/stdc++.h>
#define For(i,m,n) for(register int i=m;i<n;i++)
using namespace std;
template <class T>
inline void read(T &x)
{
	x=0;T f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	x=x*f;
}
const int MaxN = 2e3, MaxM = 5000100;
const int INF=1e8;
struct edge{
    int next;
    int to;
    int dis;
    int from;
}e[MaxM];
int head[MaxN],pre[MaxN],tot;
int resDis[MaxN];
bool vis[MaxN];
struct node{
    int dis;
    int x;
};
struct cmp{
    bool operator()(node& n1,node &n2){
        return n1.dis>n2.dis;
    }
};
inline void addEdge(int u,int v,int w)
{
    tot++;
    e[tot].from=u;
    e[tot].to=v;
    e[tot].dis=w;
    e[tot].next=head[u];
    head[u]=tot;
}
int n,m;
priority_queue<node,vector<node>,cmp > Q;
inline void dijkstra(int s,int dele_u,int dele_v)
{
    For(i,1,n+1)    resDis[i]=INF,vis[i]=0;
    resDis[s]=0;
    Q.push((node){0,s});
    while(Q.size()){
        node nowState=Q.top();Q.pop();
        int nowU=nowState.x;
        if(vis[nowU])    continue;
        vis[nowU]=1;
        for(int i=head[nowU];i;i=e[i].next){
            int v=e[i].to;
            if(dele_u==nowU&&dele_v==v)  continue;
            if(resDis[v]>resDis[nowU]+e[i].dis){
                resDis[v]=resDis[nowU]+e[i].dis;
                pre[v]=nowU;                
            }
            if(!vis[v]){
                Q.push((node){resDis[v],v});
            }
        }
    }
}

void input()
{
    read(n);read(m);
    For(i,1,m+1){
        int u,v,w;
        read(u),read(v),read(w);
        addEdge(u,v,w);
        addEdge(v,u,w);
    }
}

int main()
{
    // freopen("out.txt","w",stdout);
    input();
    dijkstra(1,0,0);
    int now_u=pre[n];
    int now_v=n;
    vector<pair<int,int> > path;
    while(now_u){
        path.push_back(make_pair(now_u,now_v));
        now_v=now_u;
        now_u=pre[now_v];
    }
    int maxx=0;
    For(i,0,path.size()){
        pair<int,int> &tmp=path[i];
        dijkstra(1,tmp.first,tmp.second);
        maxx=max(maxx,resDis[n]);
    }
    cout<<maxx;
    return 0;
}

2020/10/12 15:59
加载中...