MnZN刚学oi求助,样例能过,交上全wa
查看原帖
MnZN刚学oi求助,样例能过,交上全wa
232507
OK咯莫名其妙楼主2021/11/17 20:57
#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
#define int long long
int n,m;
struct node{
    int fz,fm;
}w[maxn];
int sum=0;
int size[maxn];
int qwq[maxn];
int head[maxn];
int rd[maxn];
queue<int> q;
struct e{
    int u,v;
    int nxt;
}edge[maxn];
int tot;
void add(int u,int v){
    edge[++tot].u=u;
    edge[tot].v=v;
    edge[tot].nxt=head[u];
    head[u]=tot;
}
int gcd(int a,int b){
    if(b==0)return a;
    else
    return gcd(b,a%b);
}
void yf(int x){
    int tmp=gcd(w[x].fz,w[x].fm);
    w[x].fz=w[x].fz/tmp;
    w[x].fm=w[x].fm/tmp;
}
void add_shu(int a,int b){
    int tmp=gcd(w[a].fm,w[b].fm);
    int lcm=w[a].fm*w[b].fm/tmp;
    w[a].fz=w[a].fz*(lcm/w[a].fm);
    w[b].fz=w[b].fz*(lcm/w[b].fm);
    w[b].fz=w[a].fz+w[b].fz;
    w[a].fm=lcm;
    w[b].fm=lcm;
    yf(b);
}
void bfs(){
    while(!q.empty()){
        int u=q.front();
        q.pop();
        if(size[u])w[u].fm=w[u].fm*size[u];
        if(w[u].fz)yf(u);
        for(int i=head[u];i;i=edge[i].nxt){
            int v=edge[i].v;
            rd[v]--;
            add_shu(u,v);
            if(rd[v]==0)
                q.push(v);
        }
    }
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
    	w[i].fm=1,w[i].fz=0;
        int cnt;
        cin>>cnt;
        size[i]=cnt;
        if(size[i]==0)qwq[++sum]=1;
        for(int j=1;j<=cnt;j++){
            int k;
            cin>>k;
            add(i,k);
            rd[k]++;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(rd[i]==0)
        {
            w[i].fz=w[i].fm=1;
            q.push(i);
        }
    }
    bfs();
    for(int i=1;i<=sum;i++)
    {
        yf(qwq[i]);
        cout<<w[qwq[i]].fz<<" "<<w[qwq[i]].fm<<endl;
    }
    return 0;
}
2021/11/17 20:57
加载中...