求调悬2关
查看原帖
求调悬2关
681313
cute_overmind楼主2024/9/26 13:47

rt,本人已调3d已疯。

#include <bits/stdc++.h>
using namespace std;
//#define int long long
const int N = 1e5 + 10;
int n , m  , son[N] , fa[N] , cnt , head[N];
double up[N] , down[N] , ans;
struct edge{
	int to , ne , w;
	edge(){}
	edge(int to , int ne , int w): to(to) , ne(ne) , w(w){}
}e[N << 1];
void add(int x , int y , int z){
	e[++cnt] = edge(y , head[x] , z);
	head[x] = cnt;
}
#define v e[i].to
int pos;
bool vis[N] , flag;
void dfs1(int u , int k){
	vis[u] = true;
	for(int i = head[u];;i = e[i].ne){
		if(v != k){
			if(vis[v]){ 
				pos = v; 
				return;
			}	
			dfs1(v , u);
			if(!flag && pos == u){
				flag = true;
				return;
			}
			if(flag) break;
		}
		
	}
	vis[u] = false;
}
int t , disl[22] , disr[22] , dfn[N] ,  path[22];
int dfs2(int u , int k){
	dfn[u] = ++t , path[t] = u;
	fa[u] = 2;
	for(int i = head[u];;i = e[i].ne){
		if(v != k && vis[v]){
			if(!dfn[v]) dfs2(v , u);
			disr[dfn[u]] = disl[dfn[v]] = e[i].w;
			break;
		}
	}
}
void dfs_down(int u , int k){
	for(int i = head[u];;i = e[i].ne){
		if(v != k && !vis[v]){
			fa[v] = 1;
			dfs_down(v , u);
			son[u]++;
			down[u] += down[v] + e[i].w;
		}
	}
	if(son[u]) down[u] /= son[u];
}
void dfs_up(int u , int k , int w){
	up[u] = w;
	if(fa[k] + son[k] - 1)
		up[k] += (up[k] * fa[k] + down[k] * son[k] - down[u] - w) / (fa[k] + son[k] - 1);
	for(int i = head[u];;i = e[i].to){
		if(v != k) dfs_up(v , u , e[i].w);
	}
} 
void solve(){
	dfs_down(1 , 0);
	for(int i = head[1];;i = e[i].ne)
		dfs_up(v , 1 , e[i].w);
}
#define nxt(x) (x==t?1:x+1)
#define pre(x) (x==1?t:x-1)
double tmp;
void solve1(){
	dfs1(1 , 0);
	dfs2(pos , 0);
	for(int i = 1;i <= t;i++)
		dfs_down(path[i] , 0);
	for(int i = 1;i <= t;i++){
		int x = path[i];
		tmp = 0.5;
		for(int j = nxt(i);j != i;j = nxt(j)){
			int y = path[j];
			if(nxt(j) == i) up[x] += tmp * (disl[j] + down[y]);
			else up[x] += tmp * (down[y] * son[y] / (son[y] + 1) + disl[j]);
			tmp /= (son[y] + 1);
		}
		tmp = 0.5;
		for(int j = pre(i);j != i;j = pre(j)){
			int y = path[j];
			if(pre(j) == i) up[x] += tmp * (disr[j] + down[y]);
			else up[x] += tmp * (down[y] * son[y] / (son[y] + 1) + disr[j]);
			tmp /= (son[y] + 1);
		}
		for(int j = head[x];;j = e[j].ne){
			if(!vis[e[j].to])
				dfs_up(e[j].to , x , e[j].w);
		}
	}
}
#undef v
signed main()
{
	cin >> n >> m;
	for(int i = 1;i <= m;i++){
		int u , v , w;
		cin >> u >> v >> w;
		add(u , v , w);
		add(v , u , w);
	}
	if(n != m) solve();
	else solve1();
	for(int i = 1;i <= n;i++)
		ans += (down[i] * son[i] + up[i] * fa[i]) / (son[i] + fa[i]);
	printf("%.5lf\n", ans / n);
	return 0;
}
2024/9/26 13:47
加载中...