比赛 2024暑期C班集训1 评测结果 AAAWWWAWWWWWWWWWWWWW
题目名称 熙熙攘攘、我们的城市 最终得分 20
用户昵称 Untitled 运行时间 2.065 s
代码语言 C++ 内存使用 24.04 MiB
提交时间 2024-07-01 11:17:47
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

int const N=1000010;
int n,m,idx,d[N];
int head[N],Next[N],ver[N],val[N];
long long s[N],f[N];

void edge(int a,int b,int v){
    Next[++idx]=head[a],head[a]=idx,ver[idx]=b,val[idx]=v,s[idx]=v*v;
    return;
}

struct node{
    int y,x,dis;
};

struct cmp{
    bool operator ()(node a,node b){
        if (a.dis==b.dis) return s[a.x]<s[b.x];
        return a.dis>b.dis;
    }
};

void dij(){
    priority_queue<node,vector<node>,cmp> q;
    memset(d,0x3f,sizeof(d));
    d[1]=0;
    for (int i=head[1];i;i=Next[i]){
        q.push(node{1,i,val[i]});
    }
    node p;
    int x,y;
    while (q.size()){
        p=q.top();x=ver[p.x],y=p.y;q.pop();
        if (p.dis>=d[x] || f[y]+s[p.x]<=f[x]) continue;
        d[x]=p.dis,f[x]=f[y]+s[p.x];
        if (x==n) return;
        for (int i=head[x];i;i=Next[i]){
            q.push(node{x,i,d[x]+val[i]});
        }
    }
    return;
}

int main(){
    freopen("Wrong_world.in","r",stdin);
    freopen("Wrong_world.out","w",stdout);
    
    int a,b,v,l;
    scanf("%d %d",&n,&m);
    for (int i=1;i<=m;i++){
        scanf("%d %d",&l,&a);
        for (int j=1;j<=l;j++){
            scanf("%d %d",&v,&b);
            edge(a,b,v);
            a=b;
        }
    }
    dij();
    printf("%d %lld",d[n],f[n]);
    
    return 0;
}