30pts求调 TLE*4 RE*3
查看原帖
30pts求调 TLE*4 RE*3
421758
HANDSOME_FZZ楼主2023/7/28 17:21
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#define N 100005
#define ull unsigned long long
using namespace std;
int n,m,head[N],w[N],num,d[N],f[15],ff;
bool vis[N];
struct way{
	int nx,de;//the next & the demination
}q[N*5];

struct spot{
	ull fz,fm;
}z[N];

int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		 c=getchar();
	}
	while(c>='0' && c<='9'){
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x*f;
}

void establish(int st,int ed){
	num++;
	q[num].nx=head[st]; head[st]=num; q[num].de=ed;
}

void loading(){
	memset(head,-1,sizeof(head));
	n=read(); m=read(); int x;
	for(int i=1;i<=n;i++){
		w[i]=read();
		if(!w[i]){ ff++; f[ff]=i; continue; }//Last out
		for(int j=1;j<=w[i];j++){
			x=read(); establish(i,x); d[x]++;
		}
	}
}

int maxgys(int x,int y){
	ull o=max(x,y),k=min(x,y);
	ull r=o%k;
	while(r>0){
		o=k; k=r; r=o%k;
	}
	return k;
}

void yf(int x){
	ull t=maxgys(z[x].fz,z[x].fm);
	if(t==1) return;
	z[x].fz/=t; z[x].fm/=t;
}

void add(int a,int b){
	ull s=z[b].fm*w[b];
	if(z[a].fz==0){z[a].fz=z[b].fz; z[a].fm=s;}// z[a].fm==0
	else{
		ull t=maxgys(z[a].fm,s);
		z[a].fz=z[a].fz*(s/t)+z[b].fz*(z[a].fm/t);
		z[a].fm=s/t*z[a].fm;
	}
	yf(a);
}

void pwater(int x){//pai water
	queue <int> p; vis[x]=1;
	for(int i=head[x];i>0;i=q[i].nx){
		add(q[i].de,x); d[q[i].de]--; vis[q[i].de]=1;//whether join the queue or not
		p.push(q[i].de); 
	}
	while(!p.empty()){
		int s=p.front(); p.pop();
		if(d[s]){p.push(s); continue;}//if there is edge to point_s still,handle it latter 
		for(int i=head[s];i>0;i=q[i].nx){
			add(q[i].de,s); d[q[i].de]--;
			if(!vis[q[i].de]){p.push(q[i].de);vis[q[i].de]=1;}
		}
	}
}

void out(){
	for(int i=1;i<=ff;i++) printf("%d %d\n",z[f[i]].fz,z[f[i]].fm);
}

void solve(){
	queue<int> p;
	for(int i=1;i<=n;i++) //no way
	if(!d[i]) p.push(i);
	while(!p.empty()){
		int t=p.front(); p.pop();
		z[t].fz=z[t].fm=1;
		memset(vis,0,sizeof(vis));
		pwater(t);
	}
}

int main(){
	//freopen("water.in","r",stdin);
	//freopen("water.out","w",stdout);
	loading();
	solve();
	out();
	return 0;
}

2023/7/28 17:21
加载中...