AC代码仅供参考
查看原帖
AC代码仅供参考
229907
lxyzpjy楼主2020/12/6 11:15

其实是一道很水的图论,一开始还担心会炸内存

这是我的AC代码,仅供参考(由于不能发题解呜呜呜)

重点核心技术__int128

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
unsigned long long n,m,x,y;
struct node
{
	unsigned long long ba;
	unsigned long long dad;
	unsigned long long sl;
	unsigned long long son[10];
};
node t[100005];
bool b[100005];
__int128 a[100005][3];
inline void output(__int128 x)
{
    if(x>9)
        output(x/10);
    putchar(x%10+'0');
}
__int128 gcd(__int128 a,__int128 b)
{
	if(b==0) return a;
	return gcd(b,a%b);
}
void chuli(__int128 aa,__int128 bb,__int128 cc)
{
	if(a[cc][1]==0) 
	{
		a[cc][1]=aa;
		a[cc][2]=bb;
	}
	else
	{
		__int128 lmx=aa*a[cc][2]+bb*a[cc][1];
		__int128 lym=bb*a[cc][2];
		__int128 cz=gcd(lmx,lym);
		a[cc][1]=lmx/cz;
		a[cc][2]=lym/cz;
	}
}
void dfs(__int128 xx)
{
	if(t[xx].sl==0) return;
	__int128 za=a[xx][1],zb=a[xx][2]*t[xx].sl;
	__int128 f=gcd(za,zb);
	za/=f;zb/=f;
	for(int i=1;i<=t[xx].sl;i++)
	{
		chuli(za,zb,t[xx].son[i]);
		t[t[xx].son[i]].dad++;
		if(t[t[xx].son[i]].dad==t[t[xx].son[i]].ba)dfs(t[xx].son[i]);
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		if(i<=m) a[i][1]=a[i][2]=1;
		scanf("%d",&x);
        t[i].sl=x;
		for(int j=1;j<=x;j++)
		{
		  scanf("%d",&y);
		  t[i].son[j]=y;
		  t[y].ba++;	
		}
		if(x==0) b[i]=true;
	}
	for(int i=1;i<=m;i++)
	{
		dfs(i);
	}
	for(int i=1;i<=n;i++)
	{
		if(b[i]) 
		{
			output(a[i][1]);
			cout<<' ';
			output(a[i][2]);
			cout<<endl;
		}
	}
}


2020/12/6 11:15
加载中...