我调了半天爆搜,仍然17分,想问一下有没有剪枝可以通过此题
我的爆搜:
#include <bits/stdc++.h>
using namespace std;
namespace Main
{
const int maxn=55;
int n,m;
vector<int> imap[maxn];
int ans[maxn];
int top;
bool vis[maxn];
int dis[maxn][maxn];
void dfs(int x,int cnt)//cnt代表走过了几个点
{
ans[++top]=x;
if(x==1&&cnt==n+1)
{
for(int i=1;i<top;i++)
{
printf("%d ",ans[i]);
}
printf("\n");
top--;
return;
}
if(cnt>=n+1&&((n+1)-cnt<dis[x][1]))
{
top--;
return;
}
vis[x]=1;
for(int to:imap[x])
{
if(!vis[to]||(to==1&&top==n))
{
dfs(to,cnt+1);
}
}
vis[x]=0;
top--;
}
inline void floyd()
{
for(int mid=1;mid<=n;mid++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dis[i][j]=min(dis[i][j],dis[i][mid]+dis[mid][j]);
}
}
}
}
void main()
{
memset(dis,0x3f3f3f3f,sizeof(dis));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
imap[u].emplace_back(v);
dis[u][v]=1;
}
for(int i=1;i<=n;i++)
{
sort(imap[i].begin(),imap[i].end());
}
floyd();
dfs(1,1);
#ifndef ONLINE_JUDGE
system("pause");
#endif
}
}
int main()
{
Main::main();
return 0;
}