1 条题解
-
0

#include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; const int M = 100005; #define int long long #define pb push_back int read() { int x=0,f=1;char c; while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;} while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int n,m,a[M],b[M],c[M],f[M],p[M],in[M],fa[M]; vector<int> g[M],G[M]; int find(int x) { if(x==fa[x]) return x; return fa[x]=find(fa[x]); } void dfs(int u) { f[u]=c[u]; for(int v:G[u]) { dfs(v);b[u]+=b[v]; f[u]=min(f[u],max(f[v],c[u]-b[v])); } } signed main() { n=read();m=read(); for(int i=1;i<=n;i++) { a[i]=read();b[i]=read(); c[i]=max(a[i]-b[i],0ll); p[i]=fa[i]=i; } for(int i=1;i<=m;i++) { int u=read(),v=read(); g[u].pb(v);g[v].pb(u); } sort(p+1,p+1+n,[&](int i,int j) {return c[i]<c[j];}); for(int i=1;i<=n;i++) { int u=p[i];in[u]=1; for(int v:g[u]) if(in[v] && find(u)^find(v)) { G[u].pb(find(v)); fa[find(v)]=find(u); } } int rt=p[n];dfs(rt); printf("%lld\n",f[rt]+b[rt]); }
- 1
信息
- ID
- 9372
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者