只过样例救命
查看原帖
只过样例救命
544571
Locix_Elaina_Celome楼主2022/12/6 18:06
#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#define REG register
#define INL inline
#define P 998244353
#define LL long long
using namespace std;
int t[2005],las[2005],fir[1005],num;
INL void add(REG int u,REG int v){
	t[++num]=v;
	las[num]=fir[u];
	fir[u]=num;
}
int n,m;
int ca,ra;
INL void read(REG int& x){
	x=0;
	REG char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while('/'<c&&c<':'){
		x=x*10+c-'0';
		c=getchar();
	}
}
int dis[1005][1005];
int vis[1005];
void bfs(int root){
	queue<int> q;
	q.push(root);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=1;
		for(int i=fir[u];i;i=las[i]){
			if(vis[t[i]])continue;
			q.push(t[i]);
			dis[root][t[i]]=dis[root][u]+1;
		}
	}
}
int mv[1005][1005];
double dp[1005][1005];
int oud[1005];
double dfs(int x,int y){
	if(x == y) return 0;
	if(mv[x][y] ==y){
		return 1;
	} 
	if( dp[x][y] >= 0.0001) return dp[x][y];
	double sum=dfs(mv[mv[x][y]][y],y);
	for(int i=fir[y];i;i=las[i]){
		sum+=dfs(mv[mv[x][y]][y],t[i]);
		
	}
	return dp[x][y]=sum/(oud[y]+1.0)+1.0;
}
signed main(){
	read(n);
	read(m);
	read(ca);
	read(ra);
	for(REG int i=1;i<=m;i++){
		REG int x,y;
		read(x);
		read(y);
		add(x,y);
		add(y,x);
		oud[x]++;
		oud[y]++;
	}
	for(REG int i=1;i<=n;i++){
		memset(vis,0,sizeof vis);
		bfs(i);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			mv[i][j]=i; 
			for(int k=fir[i];k;k=las[k]){
				if(dis[mv[i][j]][j]>dis[t[k]][j]||(dis[mv[i][j]][j]==dis[t[k]][j] && mv[i][j]>t[k])){
					mv[i][j]=t[k];
				}
			}
		}
	}
printf("%.3lf",dfs(ca,ra));
}
2022/12/6 18:06
加载中...