为什么double能过longdouble过不了?
查看原帖
为什么double能过longdouble过不了?
612567
Kazeno_Akina楼主2024/3/6 15:34

rt.

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+5;
struct edge{int ver,nxt;};
int n,m,tot,deg[N],cnt[N],head[N<<1];
edge e[N<<1];
double f[N],sum[N];
bitset<N> vis;
priority_queue<pair<double,int>> q;
inline void dijkstra(){
	q.push({0,n});
	while(!q.empty()){
		int x(q.top().second);
		q.pop();
		if(vis[x]) continue;
		vis[x]=1;
		for(int i(head[x]);i;i=e[i].nxt){
			int y(e[i].ver);
			if(vis[y]) continue;
			cnt[y]++,sum[y]+=f[x];
			f[y]=(deg[y]+sum[y])/cnt[y];
			q.push({-f[y],y});
		}
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> n >> m;
	for(int i(1),u,v;i<=m;++i){
		cin >> u >> v;
		e[++tot].ver=v,e[tot].nxt=head[u],head[u]=tot;
		e[++tot].ver=u,e[tot].nxt=head[v],head[v]=tot;
		++deg[u],++deg[v];
	}
	dijkstra();
	printf("%0.7lf\n",f[1]);
	return 0;
}

WA0代码:

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+5;
struct edge{int ver,nxt;};
int n,m,tot,deg[N],cnt[N],head[N<<1];
edge e[N<<1];
long double f[N],sum[N];
bitset<N> vis;
priority_queue<pair<long double,int>> q;
inline void dijkstra(){
	q.push({0,n});
	while(!q.empty()){
		int x(q.top().second);
		q.pop();
		if(vis[x]) continue;
		vis[x]=1;
		for(int i(head[x]);i;i=e[i].nxt){
			int y(e[i].ver);
			if(vis[y]) continue;
			cnt[y]++,sum[y]+=f[x];
			f[y]=(deg[y]+sum[y])/cnt[y];
			q.push({-f[y],y});
		}
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> n >> m;
	for(int i(1),u,v;i<=m;++i){
		cin >> u >> v;
		e[++tot].ver=v,e[tot].nxt=head[u],head[u]=tot;
		e[++tot].ver=u,e[tot].nxt=head[v],head[v]=tot;
		++deg[u],++deg[v];
	}
	dijkstra();
	printf("%0.7lf\n",f[1]);
	return 0;
}

请问这是为什么?

2024/3/6 15:34
加载中...