求 hack
查看原帖
求 hack
448873
Pig_py楼主2023/8/12 16:15

rt,AC 了但感觉不是很对(

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,h[5005];
long long dis[5005][2];
int vis[5005];
struct Edge{
    int to,nxt,w;
}e[500005];
void add(int u,int v,int w){
    cnt++;
    e[cnt].to=v;
    e[cnt].w=w;
    e[cnt].nxt=h[u];
    h[u]=cnt;
}
void spfa(int s){
    for(int i=1;i<=n;i++){
        dis[i][0]=1000000000000000ll;
        dis[i][1]=1000000000000000ll;
        vis[i]=0;
    }
    queue<int>q;
    dis[s][0]=0;
    dis[s][1]=0;
    q.push(s);
    vis[s]=1;
    while(!q.empty()){
        int x=q.front();
        q.pop();
        vis[x]=0;
        for(int i=h[x];i;i=e[i].nxt){
            if(dis[e[i].to][1]>dis[x][1]+e[i].w){
                //printf("dis[%d]:%lld+%d<dis[%d]:%lld\n",x,dis[x][1],e[i].w,e[i].to,dis[e[i].to][1]);
                dis[e[i].to][0]=dis[e[i].to][1];
                dis[e[i].to][1]=dis[x][1]+e[i].w;
                if(!vis[e[i].to]){
                    q.push(e[i].to);
                    vis[e[i].to]=1;
                }
            }
                if(dis[x][0]+e[i].w<dis[e[i].to][0]&&dis[x][0]+e[i].w>dis[e[i].to][1]){
                    dis[e[i].to][0]=dis[x][0]+e[i].w;
                    if(!vis[e[i].to]){
                        q.push(e[i].to);
                        vis[e[i].to]=1;
                    }                    
                }
                if(dis[x][1]+e[i].w<dis[e[i].to][0]&&dis[x][1]+e[i].w>dis[e[i].to][1]){
                    dis[e[i].to][0]=dis[x][1]+e[i].w;
                    if(!vis[e[i].to]){
                        q.push(e[i].to);
                        vis[e[i].to]=1;
                    }                    
                }
            if(dis[e[i].to][0]>dis[e[i].to][1]+2*e[i].w){
                dis[e[i].to][0]=dis[e[i].to][1]+2*e[i].w;
                if(!vis[e[i].to]){
                    q.push(e[i].to);
                    vis[e[i].to]=1;
                }                      
            }            
        }
    }
}
signed main(){
    scanf("%d%d",&n,&m);
    for(int i=1,u,v,w;i<=m;i++){
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
    }
    spfa(1);
    //for(int i=1;i<=n;i++){
        //printf("dis[%d]:0:%lld 1:%lld\n",i,dis[i][0],dis[i][1]);
    //}
    printf("%lld",dis[n][0]);
}
2023/8/12 16:15
加载中...