我的方法是用tarjan求割点,然后建树并枚举两个割点之间的边求最大最小值,如果m>=n证明该图中有环,此种情况下加特判。为什么写出来的代码wa了
#include<bits/stdc++.h> #define MAXN 10000010 #define int long long #define raed() read() #define mp(x,y) make_pair(x,y) #define rep(i,l,r) for(int i=l;i<=r;i++) #define per(i,l,r) for(int i=l;i>=r;i--) #define lowbit(x) (x&(-x)) #define ls(x) (x<<1) #define rs(x) (x<<1|1) #define inf 0x3f3f3f3f3f3f #define mod (int)(1e9+7) #define PI 3.1415926535 #define test(s) freopen("s","r",stdin); #define endl "\n" using namespace std; int n,m; int val[MAXN],sz[MAXN]; int ansmx,ansmn; int ver[MAXN],nxt[MAXN],head[MAXN],tot; inline void add(int x,int y) { ver[++tot]=y;nxt[tot]=head[x]; head[x]=tot;return; } int dfn[MAXN],low[MAXN]; int vis[MAXN],child; int now; inline void dfs(int x,int fa) { now++; dfn[x]=low[x]=now; for(int i=head[x];i;i=nxt[i]) { int y=ver[i]; if(!dfn[y]) { dfs(y,x); low[x]=min(low[x],low[y]); if(low[y]>=dfn[x]&&(x!=fa)) vis[x]=1; if(x==fa) child++; } low[x]=min(low[x],dfn[y]); } if(x==fa&&child>=2) vis[x]=1; return; } int out[MAXN]; int f[MAXN]; inline int find(int x) { if(f[x]==x) return x; return f[x]=find(f[x]); } vector<int> son[MAXN]; inline void build(int x,int fa) { sz[x]+=val[x]; for(vector<int>::iterator i=son[x].begin();i!=son[x].end();i++) { int y=*i; if(y==fa) continue; build(y,x); sz[x]+=sz[y]; } return; } inline void get_ans(int x,int fa) { for(vector<int>::iterator i=son[x].begin();i!=son[x].end();i++) { int y=*i; if(y==fa) continue; get_ans(y,x); } if(vis[x]&&vis[fa]) { ansmx=max(ansmx,sz[x]*(sz[1]-sz[x])); ansmn=min(ansmn,sz[x]*(sz[1]-sz[x])); } return; } inline void solve(int wtf) { ansmx=-(int)(1e8-1); ansmn=(int)(1e8); cin>>n>>m; rep(i,1,n) { f[i]=i; cin>>val[i]; } rep(i,1,m) { int x,y; cin>>x>>y; add(x,y); add(y,x); out[x]++; out[y]++; if(find(x)!=find(y)) { f[find(x)]=find(y); son[x].push_back(y); son[y].push_back(x); } } rep(i,1,n) if(out[i]==1) vis[i]=1; dfs(1,1); build(1,0); get_ans(1,0); if(m>=n) { ansmx=max(ansmx,sz[1]*sz[1]); ansmn=min(ansmn,sz[1]*sz[1]); } cout<<ansmn<<" "<<ansmx<<endl; rep(i,1,m<<1) { sz[i]=val[i]=f[i]=out[i]=0; son[i].clear(); dfn[i]=low[i]=0; ver[i]=nxt[i]=head[i]=0; vis[i]=0; child=0; tot=0; } return; } signed main() { // freopen("P3092_2.in","r",stdin); ios_base::sync_with_stdio(false); cin.tie(0); int T=1; cin>>T; rep(i,1,T) solve(i); return 0; } /* 1 8 11 1 2 3 4 5 6 7 8 1 2 1 4 2 4 2 3 3 4 4 5 5 6 6 7 5 7 5 8 7 8 */
全部评论
(1) 回帖