Problem 1055 : Huge Family

問題概要

日本語なので本文参照……
なのだがUAPC本番中は本文を読んでもよくわからなかった。


全ての頂点の次数が2の、重み付き単純グラフGが与えられる。

このグラフの部分グラフSで以下のようなものを考える。

  • Gで連結だった部分はSでも連結
  • そのようなグラフの中でSの重みの和は最小


Sの場合の数をmod10007で求めよ。

解法

条件から元のグラフは小さいループが何個かできたものしかありえない。


Sは、一つのループにつき重みが最大の辺を除去してできるグラフであるから、
ループごとに重さ最大の辺が(1位タイの辺)が何個あるかを数えて、かければよい。

ソースコード

int mod=10007;
int n,e[100000][2],w[100000][2];
bool v[100000];

int mx,mxn;
void rec(int c)
{
	v[c]=1;
	rep(i,2)
	{
		if(mx<w[c][i])mx=w[c][i],mxn=0;
		if(mx==w[c][i])mxn++;
		
		if(!v[e[c][i]])rec(e[c][i]);
	}
}
int main()
{
	while(scanf("%d",&n),n)
	{
		rep(i,n)rep(j,2)scanf("%d%d",e[i]+j,w[i]+j);
		int ans=1;
		rep(i,n)v[i]=0;
		rep(i,n)if(!v[i])
		{
			mx=0; mxn=1;
			rec(i);
			ans=(ans*mxn/2)%mod;
		}
		printf("%d\n",ans);
	}
	return 0;
}