为什么在循环内开数组会很卡?
查看原帖
为什么在循环内开数组会很卡?
445049
Winkle楼主2021/9/3 23:46

这道题 最初的代码:

#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多 求解答,谢谢

2021/9/3 23:46
加载中...