标程:
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 }
题解:转换+性质神题