arc098F Donation

标程:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int read()
 5 {
 6    int x=0,f=1;char ch=getchar();
 7    while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
 8    while (ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
 9    return x*f;
10 }
11 const int N=100005;
12 int cnt,head[N],a[N],b[N],id[N],u,v,fa[N],n,m,x,vis[N];
13 ll f[N],bsum[N];
14 struct node{int to,next;}num[N*2];
15 void add(int x,int y)
16 {num[++cnt].to=y;num[cnt].next=head[x];head[x]=cnt;}
17 bool cmp(int A,int B) {return a[A]<a[B];}
18 int getfather(int x) {return fa[x]?fa[x]=getfather(fa[x]):x;}
19 int main()
20 {
21     n=read();m=read();
22     for (int i=1;i<=n;i++) a[i]=read(),b[i]=read(),a[i]=max(a[i]-b[i],0),id[i]=i;
23     for (int i=1;i<=m;i++) u=read(),v=read(),add(u,v),add(v,u);
24     sort(id+1,id+n+1,cmp);
25     for (int i=1;i<=n;i++)
26     {
27         x=id[i];vis[x]=1;f[x]=a[x];bsum[x]=b[x];
28         for (int j=head[x];j;j=num[j].next)
29           if (vis[num[j].to])
30           {
31                 int y=getfather(num[j].to);
32                 if (x==y) continue;
33                 fa[y]=x;bsum[x]+=bsum[y];
34                 f[x]=min(f[x],max(f[y],a[x]-bsum[y]));
35           }
36     }
37     printf("%lld\n",bsum[id[n]]+f[id[n]]);
38    return 0;
39 }

题解:转换+性质神题

猜你喜欢

转载自www.cnblogs.com/Scx117/p/9118447.html