比赛 |
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;
}