社区讨论

99pts求条,必关

P1186玛丽卡参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mlqp8pvb
此快照首次捕获于
2026/02/17 22:29
前天
此快照最后确认于
2026/02/18 22:12
17 小时前
查看原帖
我的方法:
堆优化的dijkstra(用优先队列实现)
先dijkstra求出最短路,然后枚举去掉哪条边,再跑n次dijkstra,记录结果得出最大的方案。
CPP
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
const int maxn=1000+20,inf=1234567890;
typedef pair<int,int> P;
struct edge{int to,w;};
vector<edge>G[maxn];
int n,m,pre[maxn],d[maxn];
priority_queue<P,vector<P>,greater<P> >que;
void read(int &n){
    n=0;int f=1;
    char ch=getchar();
    while(ch<'0' || ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    do{
        n=n*10+ch-'0';
        ch=getchar();
    }while(ch>='0' && ch<='9');
    n=n*f;
    return;
}
void write(int n){
    if(n<0){
        putchar('-');
        n=0-n;
    }
    if(n>=10) write(n/10);
    putchar((n % 10)+'0');
    return;
}
inline void add_edge(int u,int v,int w){
    edge e;e.to=v;e.w=w;
    G[u].push_back(e);
    return;
}
void init(){
    read(n);read(m);
    for(int i=1;i<=m;i++){
        int u,v,w;
        read(u);read(v);read(w);
        add_edge(u,v,w);
        add_edge(v,u,w);
    }
    return;
}
int dijkstra(int f,int ff){
    for(int i=1;i<=n;i++) d[i]=inf;
    d[1]=0;
    P p(0,1);que.push(p);
    while(!que.empty()){
        P temp=que.top();
        que.pop();
        int u=temp.second;
        if(d[u]<temp.first) continue;
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i].to;
            if(f==u && ff==v) continue;
            if(ff==u && f==v) continue;
            int w=G[u][i].w;
            int t=d[u]+w;
            if(d[v]>t){
                d[v]=t;
                que.push(P(t,v));
                if(!f && !ff) pre[v]=u;
            }
        }
    }
    return d[n];
}
void solve(){
    memset(pre,-1,sizeof(pre));
    int ans=dijkstra(0,0);
    int u=n;
    while(pre[u]!=-1){
        int r=dijkstra(u,pre[u]);
        if(r!=inf) ans=max(ans,r);
        u=pre[u];
    }
    write(ans);
    return;
}
int main(){
    init();
    solve();
    return 0;
}
orz

回复

4 条回复,欢迎继续交流。

正在加载回复...