rb4 矩阵22。链式前向星22

//段错误,,爆空间
#include<bits/stdc++.h>
using namespace std;
const int maxn=510;//空间 
int n,m,d,c,q,vis[maxn],g[maxn][maxn];
int ok(int s,int e){
	int f=0;
	queue<int>q;	
	q.push(s);
	while(!q.empty()){
		s=q.front();q.pop();
		if(s==e) {f=1;break;}
		for(int i=1;i<=n;i++){
			if(g[s][i]&&vis[i]){
				q.push(i);vis[i]=0;
			}
		}
	}
	return f;
}
int main(){
	int x,y;
	scanf("%d%d%d",&n,&m,&d);
	memset(g,0,sizeof(g));
	while(m--){
		scanf("%d%d",&x,&y);
		g[x][y]=g[y][x]=1; 
	}
	while(d--){
		scanf("%d%d",&c,&q);
		for(int i=1;i<=n;i++)
			g[i][c]=g[c][i]=0;
		int num=0;
		while(q--){
			scanf("%d%d",&x,&y);
			//怎么走一条路? 
			memset(vis,1,sizeof(vis));
			if(!ok(x,y)) num++;
		}
		cout<<num<<endl;
	}
}
超时
#include<bits/stdc++.h>
using namespace std;
const int maxn=50010;
int n,m,d,c,q,vis[maxn],vt[maxn];
int head[maxn],tot=0;
struct node{int v,nxt;} g[maxn<<3];
void adde(int u,int v){
	g[++tot]={v,head[u]};
	head[u]=tot;
}
int ok(int s,int e){
	int f=0;
	queue<int>q;	
	q.push(s);
	while(!q.empty()){
		s=q.front();q.pop();vis[s]=0;
		if(!vt[s]) continue; 
		if(s==e) {f=1;break;}
		for(int i=head[s];i;i=g[i].nxt){
			int v=g[i].v;
			if(vt[v]&&vis[v]){
				q.push(v);vis[v]=0;
			}
		}
	}
	return f;
}
int main(){
	int x,y;
	scanf("%d%d%d",&n,&m,&d);
	for(int i=0;i<=n;i++) head[i]=0,vt[i]=1;
	while(m--){
		scanf("%d%d",&x,&y);
		adde(x,y);adde(y,x);
	}
	while(d--){
		scanf("%d%d",&c,&q);
		vt[c]=0;
		int num=0;
		while(q--){
			scanf("%d%d",&x,&y);
			memset(vis,1,sizeof(vis));
			if(!ok(x,y)) num++;
		}
		cout<<num<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_50904510/article/details/120741624