1 条题解
-
0
自动搬运
来自洛谷,原作者为

Lips
认真刷题 努力进步!搬运于
2025-08-24 22:07:23,当前版本为作者最后更新于2020-05-24 09:17:29,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
康到楼下全用的
某已死算法,窝就来用一个思路:建完图,以 为起点跑一边 ,记录 到各个点的最短路,再对于每一次的
干草堆操作,将 与 之间建一条长度为 到这个个点的距离减 的边。再以 为起点跑一边 后,从 到 枚举,如果 到 的最短路小于 到 的最短路,那么就输出 ,否则输出 。#include<cstdio> #include<vector> #include<algorithm> #include<queue> using namespace std; const int MAXN=50010; typedef long long ll; int n,m,k; ll d[MAXN],a[MAXN],ans[MAXN]; inline int read() { int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9')s=s*10+(ch-'0'),ch=getchar(); return s*w; } inline ll read_ll() { ll s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9')s=s*10+(ch-'0'),ch=getchar(); return s*w; } struct edge { int to; ll cost; edge(int to,ll cost):to(to),cost(cost){} }; vector<edge>G[MAXN]; typedef pair<ll,int>P; void dijkstra(int s) { priority_queue<P,vector<P>,greater<P> >q; for(register int i=1;i<=n;i++) d[i]=0x3f3f3f3f; d[s]=0; q.push(make_pair(0,s)); while(!q.empty()) { P p=q.top(); q.pop(); int v=p.second; if(d[v]<p.first) continue; for(register int i=0;i<G[v].size();i++) { edge e=G[v][i]; if(d[e.to]>d[v]+e.cost) { d[e.to]=d[v]+e.cost; q.push(make_pair(d[e.to],e.to)); } } } } int main() { n=read(),m=read(),k=read(); while(m--) { int u=read(),v=read(); ll w=read_ll(); G[u].push_back(edge(v,w)); G[v].push_back(edge(u,w)); } dijkstra(n); for(register int i=1;i<=n;i++) ans[i]=d[i]; for(register int i=1;i<=k;i++) { int pos=read(); ll x=read_ll(); G[n+1].push_back(edge(pos,d[pos]-x)); } dijkstra(n+1); for(register int i=1;i<n;i++) if(d[i]<=ans[i]) printf("%d\n",1); else printf("%d\n",0); return 0; }第一篇紫题题解,珂以点个赞在走么?Orz
- 1
信息
- ID
- 4131
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者