提交时间:2026-10-28 14:05:02

运行 ID: 43266

#include<bits/stdc++.h> using namespace std; #define int long long int n,m; int a[200005]; vector<int>gp[200005]; int sum[200005],vis[200005],ssum[200005]; bool check(int mid){ int gs=0; for(int i=1;i<=n;i++)vis[i]=0,ssum[i]=sum[i]; for(int i=1;i<=n;i++){ if(sum[i]<=mid){ gs++; vis[i]=1; } } while(1){ if(gs==n)return true; bool flag=true; for(int i=1;i<=n;i++){ if(vis[i])continue; int tmp=0; for(auto it:gp[i]){ if(vis[it])continue; tmp+=a[it]; } if(tmp<=mid){ vis[i]=1; gs++; flag=false; } } if(flag)return false; } } signed main(){ // freopen("del.in","r",stdin); // freopen("del.out","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; gp[u].push_back(v); gp[v].push_back(u); } for(int i=1;i<=n;i++)for(auto it:gp[i])sum[i]+=a[it]; int l=1,r=1e9; while(l<r){ int mid=(l+r)>>1; if(check(mid))r=mid; else l=mid+1; } cout<<l; return 0; } /* 思路: */