自闭
查看原帖
自闭
143925
吴勉之楼主2020/5/25 21:10

神奇的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?????
为甚么我把概率乘起来就过了,而把所有出度乘起来再除掉却错了???
求解释

2020/5/25 21:10
加载中...