这道题 最初的代码:
#include <iostream>
#include <cstdio>
using namespace std;
int n,p;
bool a[301][301]={};
short b[301][301]={};
bool c[301]={};
short d[301]={};
int mins=301;
void dfs()
{
int p=0;
bool s=0;
for(int i=1;i<=n;i++)
{
if(c[i]==1)
{
for(int j=1;j<=b[i][0];j++)
{
if(b[i][j]!=0&&c[b[i][j]]==0)
{
p++;
d[p]=b[i][j];
}
}
}
}
for(int i=1;i<=p;i++)
{
c[d[i]]=1;
}
for(int i=1;i<=n;i++)
{
if(c[i]==1)
{
for(int j=1;j<=b[i][0];j++)
{
if(b[i][j]!=0&&c[b[i][j]]==0)
{
int bs=b[i][j];
b[i][j]=0;
s=1;
dfs();
b[i][j]=bs;
}
}
}
}
if(!s)
{
int ksk=0;
for(int i=1;i<=n;i++)
{
if(c[i])
ksk++;
}
mins=min(mins,ksk);
for(int i=1;i<=p;i++)
{
c[d[i]]=0;
d[i]=0;
}
return;
}
for(int i=1;i<=p;i++)
{
c[d[i]]=0;
d[i]=0;
}
}
int main()
{
scanf("%d %d",&n,&p);
for(int i=1;i<=p;i++)
{
int j,k;
scanf("%d %d",&j,&k);
a[j][k]=a[k][j]=1;
b[k][0]++;
b[j][0]++;
b[k][b[k][0]]=j;
b[j][b[j][0]]=k;
}
c[1]=1;
for(int i=1;i<=b[1][0];i++)
{
int wl=b[1][i];
b[1][i]=0;
dfs();
b[1][i]=wl;
}
if(mins==301)
printf("1");
else
printf("%d",mins);
return 0;
}
发现无法回溯被感染者 就改成了
#include <iostream>
#include <cstdio>
using namespace std;
int n,p;
bool a[301][301]={};
short b[301][301]={};
bool c[301]={};
int mins=301;
void dfs()
{
int p=0;
bool s=0;
short d[301]={};
for(int i=1;i<=n;i++)
{
if(c[i]==1)
{
for(int j=1;j<=b[i][0];j++)
{
if(b[i][j]!=0&&c[b[i][j]]==0)
{
p++;
d[p]=b[i][j];
}
}
}
}
for(int i=1;i<=p;i++)
{
c[d[i]]=1;
}
for(int i=1;i<=n;i++)
{
if(c[i]==1)
{
for(int j=1;j<=b[i][0];j++)
{
if(b[i][j]!=0&&c[b[i][j]]==0)
{
int bs=b[i][j];
b[i][j]=0;
s=1;
dfs();
b[i][j]=bs;
}
}
}
}
if(!s)
{
int ksk=0;
for(int i=1;i<=n;i++)
{
if(c[i])
ksk++;
}
mins=min(mins,ksk);
for(int i=1;i<=p;i++)
{
c[d[i]]=0;
d[i]=0;
}
return;
}
for(int i=1;i<=p;i++)
{
c[d[i]]=0;
d[i]=0;
}
}
int main()
{
scanf("%d %d",&n,&p);
for(int i=1;i<=p;i++)
{
int j,k;
scanf("%d %d",&j,&k);
a[j][k]=a[k][j]=1;
b[k][0]++;
b[j][0]++;
b[k][b[k][0]]=j;
b[j][b[j][0]]=k;
}
c[1]=1;
for(int i=1;i<=b[1][0];i++)
{
int wl=b[1][i];
b[1][i]=0;
dfs();
b[1][i]=wl;
}
if(mins==301)
printf("1");
else
printf("%d",mins);
return 0;
}
把一个数组放在了dfs里面 可以回溯了 但是慢了很多 不知道为什么 原来的2ms跑完样例一(n=300) 现在10s多 求解答,谢谢