关于此题一个离谱的做法
查看原帖
关于此题一个离谱的做法
250699
mot1ve楼主2020/10/22 16:37

昨天学校模拟赛考到的,不会期望dp,写了个爆搜,结果跑到比正解还快。。这种带回溯的dfs时间复杂度是多少啊?

#include<bits/stdc++.h>
using namespace std;
int n,m,idx;
double ans;
int vis[100010],head[100010],out[100010];
struct node{
	int nxt,to,w;
}edge[200010];
void add(int u,int v,int w)
{
	edge[++idx].nxt=head[u];
	edge[idx].to=v;
	edge[idx].w=w;
	head[u]=idx;
}
void dfs(int x,int len,double k)//这条路概率为k
{
	if(x==n)
	{
		ans+=1.0*len*k;//路径*概率即为对答案的贡献。
		return ; 
	}
	for(int i=head[x];i;i=edge[i].nxt)
	{
		int v=edge[i].to;
		if(vis[v])
		continue;
		vis[v]=1;
		if(out[x]==0)
		continue;
		dfs(v,len+edge[i].w,k*1.0/out[x]);
		vis[v]=0;
	}
} 
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		out[u]++;//每个点有几个出度 
		add(u,v,w);
	}
	vis[1]=1;
	dfs(1,0,1.0);
	printf("%.2lf",ans);
	return 0;
}
2020/10/22 16:37
加载中...