TLE求助
查看原帖
TLE求助
549794
ss_xgz楼主2024/10/9 16:58

每个边应该只会被bfs搜到1遍啊=/

#include<bits/stdc++.h>
using namespace std;
#define int long long
bool vis[114514];
int du[114514];//入度 
struct s{
	int v,p;
}e[2145141];
int h[114514],cnt,w1[114514],w2[114514],n,m,d[114514];//w2分之w1 
int gcd(int a,int b)
{
	if(b>a) swap(a,b);
	if(a==0||b==0) return 1;
	if(a%b==0) return b;
	return gcd(b,a%b);
}
void Add(int u,int v)
{
	e[++cnt].v=v;
	e[cnt].p=h[u],h[u]=cnt;
}
queue<int> q;
void bfs()
{
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		if(d[u]==0) continue;
		int z1=w1[u],z2=w2[u]*d[u];
		int te=gcd(z1,z2);
		z1/=te,z2/=te;
		for(int i=h[u];i;i=e[i].p)
		{
			int v=e[i].v;
			if(--du[v]==0) q.push(v);
			w1[v]=z1*w2[v]+w1[v]*z2;
			w2[v]=w2[v]*z2;
			te=gcd(w1[v],w2[v]);
			w1[v]/=te,w2[v]/=te;
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>d[i];
		if(d[i]==0)
		{
			vis[i]=1;
		}
		for(int j=1;j<=d[i];j++)
		{
			cin>>x;
			du[x]++;
			Add(i,x);
		}
	}
	for(int i=1;i<=n;i++)
	{
		w2[i]=1;
		if(!du[i]) 
		{
			w1[i]=1;
			q.push(i);
		}
	}
	bfs();
	for(int i=1;i<=n;i++)
	{
		if(vis[i])
		{
			cout<<w1[i]<<" "<<w2[i]<<endl;
		}
	}
}
2024/10/9 16:58
加载中...