竞赛讨论区 > 问下,关于L题
头像
teamaster23
发布于 03-12 11:19
+ 关注

问下,关于L题

我的方法是用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) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐