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;
}
请问这是为什么?