神奇的c++11代码
#include<bits/stdc++.h>
using namespace std;
#define N 100005
struct edge
{
int v,to,w;
}e[N<<1];
int n,m,head[N<<1],cnt,ot[N];
void add(int u,int v,int w)
{
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].to=head[u];
head[u]=cnt;
}
queue<tuple<int,int,double>>q;//0-位置 1-长度 2-概率
double ans;
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
ot[u]++;
}
//for(int i=head[1];i;i=e[i].to){printf("%d\n",i);system("pause");}puts("stop");
q.emplace(1,0,1.0);
while(!q.empty())
{
auto res=q.front();
q.pop();
//printf("%d\n",get<0>(res));system("pause");
if(get<0>(res)==n)ans+=get<1>(res)*get<2>(res);
else for(int i=head[get<0>(res)];i;i=e[i].to)
q.emplace(e[i].v,get<1>(res)+e[i].w,get<2>(res)/ot[get<0>(res)]);
}
printf("%.2lf\n",ans);
return 0;
}
上述代码AC
#include<bits/stdc++.h>
using namespace std;
#define N 100005
struct edge
{
int v,to,w;
}e[N<<1];
int n,m,head[N<<1],cnt,ot[N];
void add(int u,int v,int w)
{
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].to=head[u];
head[u]=cnt;
}
queue<tuple<int,int,int>>q;//0-位置 1-长度 2-概率
double ans;
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
ot[u]++;
}
//for(int i=head[1];i;i=e[i].to){printf("%d\n",i);system("pause");}puts("stop");
q.emplace(1,0,1);
while(!q.empty())
{
auto res=q.front();
q.pop();
//printf("%d\n",get<0>(res));system("pause");
if(get<0>(res)==n)ans+=double(get<1>(res)/get<2>(res));
else for(int i=head[get<0>(res)];i;i=e[i].to)
q.emplace(e[i].v,get<1>(res)+e[i].w,get<2>(res)*ot[get<0>(res)]);
}
printf("%.2lf\n",ans);
return 0;
}
上述代码WA2?????
为甚么我把概率乘起来就过了,而把所有出度乘起来再除掉却错了???
求解释