[玄关求调!]40pts WA后六点
查看原帖
[玄关求调!]40pts WA后六点
1094327
CV01楼主2024/11/29 12:17
#include <bits/stdc++.h>
using namespace std;
#define int __int128
long long n,m;
int d[100005],x,fa[100005],vis[100005],fm[100005],fz[100005];
vector<int> v[100005];
long long read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
void write(int x){
    if(x>9){
        write(x/10);
    }
    putchar(x%10|48);
}
int gcd(int x,int y)
{
	if(y==0)
		return x;
	return gcd(y,x%y);
}
void expand(int u, int p)
{
	int x=fz[u];
	int y=fm[u]*v[u].size();
	if(y==0) return;
	if(fm[p]==0)
	{
		fm[p]=y;
		fz[p]=x;
		return;
	}
	int p1=fz[p]*y+x*fm[p];
	int p2=fm[p]*y;
	int p3=gcd(p1,p2);
	fz[p]=p1/p3;
	fm[p]=p2/p3;
}
queue<int> q;
void bfs()
{
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
	{
		if(!fa[i])
		{
			vis[i]=1;
			q.push(i);
			fm[i]=1,fz[i]=1;
		}
	}
	while(!q.empty())
	{
		int k=q.front();
		q.pop();
		if(d[k]==0) continue;
		for(int i=0;i<v[k].size();i++)
		{
			expand(k,v[k][i]);
			if(vis[v[k][i]]) continue;
			fa[v[k][i]]--;
			if(fa[v[k][i]]==0)
			{
				vis[v[k][i]]=1;
				q.push(v[k][i]);
			}
		}
	}
}
signed main()
{
	n=read();m=read();
	for(int i=1;i<=n;i++)
	{
		d[i]=read();
		for(int j=1;j<=d[i];j++)
		{
			x=read();
			v[i].push_back(x);
			fa[x]++;
		}
	}
	bfs();
	for(int i=1;i<=n;i++)
	{
		if(d[i]==0)
		{
			write(fz[i]);
			cout << " ";
			write(fm[i]);
			cout << endl;
		}
			
	}
	return 0;
}
2024/11/29 12:17
加载中...