49分求调
查看原帖
49分求调
1010650
Expert_Dreamer楼主2024/6/19 14:11
#include<bits/stdc++.h>
using namespace std;
int n,m,t,l,deg[111],dep[11414],a[111],fa[114514][2],k;
vector<int>v[14432];
//double f[1145][1145];
bool vis[11451],b[1145][1145];
struct huge{
    int a[311],len;
}f[311][311];
huge operator+(huge x,huge y){
    for(int i=x.len+1;i<=300;i++)
        x.a[i]=0;
    for(int i=y.len+1;i<=300;i++)
        y.a[i]=0;
    huge tmp;
    tmp.len=std::max(x.len,y.len);tmp.a[tmp.len+1]=0;
    for(int i=tmp.len;i>=0;i--){
        tmp.a[i]=x.a[i]+y.a[i]+(tmp.a[i+1]/10);
        tmp.a[i+1]%=10;
    }
    while(!tmp.a[tmp.len]&&tmp.len)
        tmp.len--;
    return tmp;
}
huge div2(huge x){
    for(int i=x.len+1;i<=300;i++) x.a[i]=0;
    x.len++;
    for(int i=0;i<=x.len;i++){
        if(x.a[i]%2==1) x.a[i+1]+=10;
        x.a[i]/=2;
    }
    while(x.a[x.len]==0&&x.len) x.len--;
    return x;
}
void print(huge x){
    cout<<x.a[0]*100+x.a[1]*10+x.a[2];
    if(x.len>=3){
        cout<<".";
        for(int i=3;i<=x.len;i++) cout<<x.a[i];
    }
    cout<<"%\n";
}
void topo(){
    queue<int>q;
    for(int i=1;i<=n;i++)
        if(!deg[i])
            q.push(i),vis[i]=1,dep[i]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int vv:v[u]){
            deg[vv]--;
            if(!vis[vv]&&!deg[vv]){
                vis[vv]=0,dep[vv]=dep[u]+1;
                q.push(vv);
            }
        }
    }
    return ;
}
huge dfs(int u,int v){
    if(b[u][v]) return f[u][v];
    if(dep[u]<dep[v]) swap(u,v);
    b[u][v]=b[v][u]=1;
    return f[u][v]=f[v][u]=div2(dfs(fa[u][0],v)+dfs(fa[u][1],v));
}
void init(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==j) f[i][j].len=1,f[i][j].a[0]=1,b[i][j]=1;
            else if(!deg[i]&&!deg[j]) f[i][j].len=1,f[i][j].a[0]=0,b[i][j]=0;
        }
    }
    return ;
}
int main(){
    cin>>n>>k;
    for(int i=1,x,y,z;i<=k;i++){
        cin>>x>>y>>z;
        v[y].push_back(x);
        v[z].push_back(x);
        fa[x][0]=y;
        fa[x][1]=z;
        deg[x]+=2;
    }
    init();
    topo();
    cin>>m;
    for(int i=1,x,y;i<=m;i++) cin>>x>>y,print(dfs(x,y));
}
2024/6/19 14:11
加载中...