昨天学校模拟赛考到的,不会期望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;
}