80分 求调 十分感谢
查看原帖
80分 求调 十分感谢
177072
HearTheWindSing楼主2023/10/19 18:22

目前是WA了#4#8

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int NMAX=1000+10;

int edge[NMAX<<1],ecnt=0,fir[NMAX],nex[NMAX<<1];
int cnt[NMAX];
int go[NMAX][NMAX];
int flag[NMAX];
double mem[NMAX][NMAX];

struct node{
    int x,deep,pre;
};

struct cmp{
    bool operator()(node a,node b){
        return a.deep==b.deep ? a.pre>b.pre : a.deep>b.deep;
    }
};

void build(int u,int v){
    edge[ecnt]=v;
    nex[ecnt]=fir[u];
    fir[u]=ecnt++;
    cnt[u]++;
}

double dfs(int c,int m){
    if (c==m) return 0;
    if (go[c][m]==m || go[go[c][m]][m]==m) return 1;
    if (mem[c][m]!=-1) return mem[c][m];
    double res=dfs(go[go[c][m]][m],m);
    for (int i=fir[m];i!=-1;i=nex[i]){
        res+=dfs(go[go[c][m]][m],edge[i]);
    }
    return mem[c][m]=res/(1.0+cnt[m])+1;
}

int main(){
    memset(fir,-1,sizeof(fir));
    int n,e,c,m;
    scanf("%d%d%d%d",&n,&e,&c,&m);
    for (int i=0,a,b;i<e;i++){
        scanf("%d%d",&a,&b);
        build(a,b);
        build(b,a);
    }
    for (int i=1;i<=n;i++){
        memset(flag,0,sizeof(flag));
        priority_queue<node,vector<node>,cmp> q;
        q.push({i,1,1});
        go[i][i]=i;
        flag[i]=1;
        while (!q.empty()){
            node head=q.top();
            q.pop();
            for (int j=fir[head.x];j!=-1;j=nex[j]){
                if (flag[edge[j]]) continue;
                q.push({edge[j],head.deep+1,head.x});
                go[edge[j]][i]=head.x;
                flag[edge[j]]=head.deep+1;
            }
        }
    }
    for (int i=1;i<=n;i++){
        for (int j=1;j<=n;j++){
            mem[i][j]=-1;
        }
    }
    printf("%.3lf\n",dfs(c,m));
    return 0;
}

2023/10/19 18:22
加载中...