数据有误
查看原帖
数据有误
171868
sunzz3183楼主2022/12/23 22:44

本人代码:

#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define mk make_pair
using namespace std;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||'9'<c){if(c=='-')f=-1;c=getchar();}
    while('0'<=c&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*f;
}
const int N=5e3+5,M=1e5+5,inf=0x3f3f3f3f3f3f3f3f;
int n,m,dis[N][2];
bool vis[N][2];
struct edge{
    int nxt,v,w;
}ed[M];
int en,first[N];
void add(int u,int v,int w){
    ed[++en]={first[u],v,w};
    first[u]=en;
}
void dij(int s){
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    priority_queue<pair<int,pii> >q;
    q.push(mk(0,mk(0,s)));dis[s][0]=0;
    while(!q.empty()){
        int u=q.top().second.second,e=q.top().second.first;q.pop();
        if(vis[u][e])continue;
        vis[u][e]=1;
        for(int i=first[u];i;i=ed[i].nxt){
            if(dis[ed[i].v][0]>dis[u][e]+ed[i].w)
                dis[ed[i].v][1]=dis[ed[i].v][0],q.push(mk(-dis[ed[i].v][1],mk(1,ed[i].v))),
                dis[ed[i].v][0]=dis[u][e]+ed[i].w,q.push(mk(-dis[ed[i].v][0],mk(0,ed[i].v)));
            else if(dis[ed[i].v][1]>dis[u][e]+ed[i].w)
                dis[ed[i].v][1]=dis[u][e]+ed[i].w,q.push(mk(-dis[ed[i].v][1],mk(1,ed[i].v)));
        }
    }
    return;
}
signed main(){
    memset(first,0,sizeof(first));en=0;
    n=read();m=read();
    for(int i=1;i<=m;i++){
        int u=read(),v=read(),w=read();
        add(u,v,w);add(v,u,w);
    }
    dij(1);
    printf("%lld",dis[n][1]);
    return 0;
}

题解的代码:

#include<stdio.h>
#include <iostream>
#include<string.h>
#include <queue>
#include<math.h>
#include <vector>
#define MAX 99999999
using namespace std;
//优先队列优化版的dijk
int num[5005],num2[5005];
int n,s,t;
struct edge
{
    int to;
    int cost;
    bool operator < (const edge & a) const
    {
        return cost> a.cost;
    }
};
vector<edge>g[5005];
priority_queue<edge> vis;
void dijkstra()
{
    int i,j;
    for(i=1; i<=n; i++)
        num[i]=MAX,num2[i]=MAX;
    num[s]=0;
    vis.push((edge)
    {
        s,0
    });
    while(!vis.empty())
    {
        edge node=vis.top();
        vis.pop();
        for(i=0; i<g[node.to].size(); i++)
        {
            if(num[g[node.to][i].to]>=num[node.to]+g[node.to][i].cost)
            {
                num[g[node.to][i].to]=num[node.to]+g[node.to][i].cost;
                vis.push((edge)
                {
                    g[node.to][i].to,num[g[node.to][i].to]
                });
            }
            else if(num2[g[node.to][i].to]>num[node.to]+g[node.to][i].cost)
            {
                num2[g[node.to][i].to]=num[node.to]+g[node.to][i].cost;
                vis.push((edge)
                {
                    g[node.to][i].to,num[g[node.to][i].to]
                });
            }
            if(num2[g[node.to][i].to]>g[node.to][i].cost+num2[node.to])
                num2[g[node.to][i].to]=g[node.to][i].cost+num2[node.to];
        }
    }
}
int main()
{
    int i,j,x,y,z,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        edge tmp;
        s=1;
        for(i=0; i<m; i++)
        {
            scanf("%d%d%d",&x,&tmp.to,&tmp.cost);
            g[x].push_back(tmp);
            int t=tmp.to;
            tmp.to=x;
            g[t].push_back(tmp);
        }
        dijkstra();
        printf("%d\n",num2[n]);
    }
    return 0;
}



输入:

5 5
1 2 5
2 3 5
3 4 4
4 5 6
1 5 21

输出:

21

我的是21,分数90,但题解区28的却都过了

2022/12/23 22:44
加载中...