PTA天梯赛L2-025 分而治之(c语言实现)

原题链接
思路如下:

  1. 用邻接表存储邻接矩阵,否则遇到稀疏图的时候会出现超时的现象。
  2. 每个情况下,摧毁一个城市a等价于置a城市相连的城市数为0,与a相连的城市相连城市数减1。
  3. 如果在摧毁所有目标后依然有城市的相连城市数大于0,那么战略失败,否则战略成功。
#include 
#include 
int vn1[10010]={0},vn2[10010]={0};
int c[10010][10010];
int top[10010];//这块很尴尬,我本来想定义一个刚好的数组,但每次都数组越界,只能改成这种极大的情况。
int main(){
	int n,m,v1,v2,i,j,k;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++){
		top[i]=1;//置每一行的栈顶指针为1
	}
	for(i=0;i<m;i++){
		scanf("%d %d",&v1,&v2);
		c[v1][top[v1]++]=v2;//v2加入v1的邻接表
		c[v2][top[v2]++]=v1;
		vn1[v1]++;//与v1相连城市数+1
		vn1[v2]++;
	}
	scanf("%d",&k);
	while(k--){
		for(i=1;i<=n;i++){
			vn2[i]=vn1[i];//将vn1数组复制到vn2
		}
		int np,v,t=1;
		scanf("%d",&np);
		while(np--){
			scanf("%d",&v);
			vn2[v]=0;//置v城市的相连城市数为0
			for(i=1;i<top[v];i++){
				vn2[c[v][i]]--;//邻接表v中的城市相连城市数-1
			}
		}
		for(i=1;i<=n;i++){
			if(vn2[i]>0){//有城市的相连城市数大于0时失败
				printf("NO\n");
				t=0;
				break;
			}
		}
		if(t){
			printf("YES\n");
		}
	}
}

你可能感兴趣的:(数据结构——图,PTA天梯赛(c语言实现))