求助大神求助
查看原帖
求助大神求助
219938
花落丶子不语楼主2020/12/14 20:33

为什么只能得10分,怎么改都不知道错哪。

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
//#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m;
struct note{
ll	to,next;
};
note edge[1000000];
ll head[10000000],t,d[10000000],val[10000000],val2[10000000],r,yy,valuef[10000000],e,r2,r3,xz,xz2;
queue<ll>q;
ll maxpublic(ll k1,ll k2){
	if(k2==0)
		return k1;
	return maxpublic(k2,k1%k2);
}
void insert(ll a,ll ato)
{
	edge[++t].next=head[a];
	edge[t].to=ato;
	head[a]=t;
}
inline ll read(){
	ll 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;
}
int main()
{
	n=read();
	m=read();
	for(ll i=1;i<=n;i++)
	{
		r=read();
		for(ll j=1;j<=r;j++)
		{
			e=read();
			insert(i,e);d[e]++;
		}
	val2[i]=1;
	valuef[i]=r;
	}
for(ll i=1;i<=n;i++)
if(d[i]==0)
{
q.push(i);
val[i]=1;val2[i]=1;
}
while(!q.empty())
{
	t=q.front();q.pop();
	if(valuef[t]!=0&&val[t]!=0)val2[t]=val2[t]*valuef[t];
	else continue;
	for(ll i=head[t];i;i=edge[i].next)
	{
         yy=edge[i].to;
		r2=val2[t]*val2[yy]/maxpublic(val2[t],val2[yy]);//最小公倍数 
		val[t]=val[t]*(r2/val2[t]);//更新分子 
		val[yy]=val[yy]*(r2/val2[yy])+val[t];d[yy]--;
		val2[yy]=r2;//更新分母 
		 r3=maxpublic(val[yy],val2[yy]);
		val2[yy]=val2[yy]/r3;
		val[yy]=val[yy]/r3;
	if(d[yy]==0)q.push(yy);
	}
	val[t]=0;
	val2[t]=1;
}
for(ll i=1;i<=n;i++)
{
	if(valuef[i]==0)
	{
	printf("%d",val[i]);
	cout<<" ";
	if(val[i]==0&&val2[i]!=0)cout<<0;
	else printf("%d",val2[i]);
	cout<<endl;
}
}
}
2020/12/14 20:33
加载中...