关于Vector的一些问题
查看原帖
关于Vector的一些问题
939837
Ehundategh楼主2023/10/10 20:44

有两份代码,一份100Pts,另一份16Pts

但是底层逻辑都是一样的,只是把循环的条件从<=Target.size()-1改成了单独用一个cnt来记录该Vector的大小就正确了,否则就会RE,有没有大佬知道为什么。 16Pts代码+评测记录https://www.luogu.com.cn/record/128627049

#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 501000
#define MAXM 501000
using namespace std;
int Head[MAXN],Total=0,Start=1,Line[MAXN],Loop[MAXN],Count=0,n,cnt=0;
int Last=1<<30;
int Pointer=0;
int Size[MAXN];
bool Visited[MAXN];
bool IfLoop[MAXN];
bool Judge[MAXN];
bool Back=1;
int First=0;
queue <int> Q;
struct E{
	int St,Ed;
	int Next;
}Edge[MAXM<<1];
void Edge_Add(int St,int Ed){
	Total++;
	Edge[Total].St=St;
	Edge[Total].Ed=Ed;
	Edge[Total].Next=Head[St];
	Head[St]=Total;
}
void DFS(int Now,int From){
	cnt++;
	Line[cnt]=Now;
	vector <int> Target;
	for(int i=Head[Now];i;i=Edge[i].Next){
		int To=Edge[i].Ed;
		if(To==From) continue;
        Target.push_back(To);
	}
	sort(Target.begin(),Target.end());
	for(int i=0;i<=Target.size()-1;i++){
		DFS(Target[i],Now);
	}
}
void TopSort(){
	for(int i=1;i<=n;i++){
		if(Size[i]==1){
			Q.push(i);
			Judge[i]=1;
		}
		else Judge[i]=0;
	}
	while(!Q.empty()){
		int Now=Q.front();
		Q.pop();
		Judge[Now]=1;
		for(int i=Head[Now];i;i=Edge[i].Next){
			int To=Edge[i].Ed;
			if(Size[To]>1) Size[To]--;
			if(Size[To]==1&&Judge[To]==0) Q.push(To);
		}
	}
	for(int i=1;i<=n;i++){
		if(Size[i]==2){
			Count++;
			Loop[Count]=i;
			IfLoop[i]=1;
		}
	}
}
void DFS_JHS(int Now,int From){
	cnt++;
	Line[cnt]=Now;
	Visited[Now]=1;
	if(IfLoop[Now]){
		if(First==0) First=Now;
		vector <int> Target;
		for(int i=Head[Now];i;i=Edge[i].Next){
			int To=Edge[i].Ed;
			if(To==From) continue;
			Target.push_back(To);
		}
		sort(Target.begin(),Target.end());
		for(int i=0;i<=Target.size()-1;i++){
			if(Target[i]==First&&Back==1){
				for(int j=i+1;j<=Target.size()-1;j++){
					DFS_JHS(Target[j],Now);
				}	
				return;
			}
			if(Visited[Target[i]]) continue;
			if((!IfLoop[Target[i]])||Last>Target[i]||i!=Target.size()-1||Back==0){
				if(IfLoop[Target[i]]&&i<Target.size()-1) Last=Target[i+1];
				DFS_JHS(Target[i],Now);
			}
			else{
				if(IfLoop[Target[i]]){
					Back=0;
					for(int j=i+1;j<=Target.size()-1;j++){
						DFS_JHS(Target[j],Now);
					}
					return;
				}
			}
		}
	}
	else{
		vector <int> Target;
		for(int i=Head[Now];i;i=Edge[i].Next){
			int To=Edge[i].Ed;
			if(To==From) continue;
			if(Visited[To]) continue;
			Target.push_back(To);
		}
		sort(Target.begin(),Target.end());
		for(int i=0;i<=Target.size()-1;i++){
			if(Visited[Target[i]]) continue;
			DFS_JHS(Target[i],Now);
		}	
	}
}
int main(){

	memset(Head,0,sizeof(Head));
	memset(Size,0,sizeof(Size));
	int m;
	int In1,In2;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&In1,&In2);
		Edge_Add(In1,In2);
		Edge_Add(In2,In1);
		Size[In1]++;
		Size[In2]++;
	}
	if(m==n-1){
		DFS(Start,Start);
	}
	if(m==n){
		TopSort();
		DFS_JHS(Start,Start);
	}
	for(int i=1;i<=cnt;i++) printf("%d ",Line[i]);
	return 0;
}

100Pts代码+评测记录 https://www.luogu.com.cn/record/128628378

#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 501000
#define MAXM 501000
using namespace std;
int Head[MAXN],Total=0,Start=1,Line[MAXN],Loop[MAXN],Count=0,n,cnt=0;
int Last=1<<30;
int Pointer=0;
int Size[MAXN];
bool Visited[MAXN];
bool IfLoop[MAXN];
bool Judge[MAXN];
bool Back=1;
int First=0;
queue <int> Q;
struct E{
	int St,Ed;
	int Next;
}Edge[MAXM<<1];
void Edge_Add(int St,int Ed){
	Total++;
	Edge[Total].St=St;
	Edge[Total].Ed=Ed;
	Edge[Total].Next=Head[St];
	Head[St]=Total;
}
void DFS(int Now,int From){
	cnt++;
	Line[cnt]=Now;
	int cnt2=-1; 
	vector <int> Target;
	for(int i=Head[Now];i;i=Edge[i].Next){
		int To=Edge[i].Ed;
		if(To==From) continue;
        Target.push_back(To);
        cnt2++;
	}
	sort(Target.begin(),Target.end());
	for(int i=0;i<=cnt2;i++){
		DFS(Target[i],Now);
	}
}
void TopSort(){
	for(int i=1;i<=n;i++){
		if(Size[i]==1){
			Q.push(i);
			Judge[i]=1;
		}
		else Judge[i]=0;
	}
	while(!Q.empty()){
		int Now=Q.front();
		Q.pop();
		Judge[Now]=1;
		for(int i=Head[Now];i;i=Edge[i].Next){
			int To=Edge[i].Ed;
			if(Size[To]>1) Size[To]--;
			if(Size[To]==1&&Judge[To]==0) Q.push(To);
		}
	}
	for(int i=1;i<=n;i++){
		if(Size[i]==2){
			Count++;
			Loop[Count]=i;
			IfLoop[i]=1;
		}
	}
}
void DFS_JHS(int Now,int From){
	cnt++;
	Line[cnt]=Now;
	Visited[Now]=1;
	if(IfLoop[Now]){
		if(First==0) First=Now;
		int cnt2=-1;
		vector <int> Target;
		for(int i=Head[Now];i;i=Edge[i].Next){
			int To=Edge[i].Ed;
			if(To==From) continue;
			Target.push_back(To);
			cnt2++;
		}
		sort(Target.begin(),Target.end());
		for(int i=0;i<=cnt2;i++){
			if(Target[i]==First&&Back==1){
				for(int j=i+1;j<=cnt2;j++){
					DFS_JHS(Target[j],Now);
				}	
				return;
			}
			if(Visited[Target[i]]) continue;
			if((!IfLoop[Target[i]])||Last>Target[i]||i!=cnt2||Back==0){
				if(IfLoop[Target[i]]&&i<cnt2) Last=Target[i+1];
				DFS_JHS(Target[i],Now);
			}
			else{
				if(IfLoop[Target[i]]){
					Back=0;
					for(int j=i+1;j<=cnt2;j++){
						DFS_JHS(Target[j],Now);
					}
					return;
				}
			}
		}
	}
	else{
		int cnt2=-1;
		vector <int> Target;
		for(int i=Head[Now];i;i=Edge[i].Next){
			int To=Edge[i].Ed;
			if(To==From) continue;
			if(Visited[To]) continue;
			Target.push_back(To);
			cnt2++;
		}
		sort(Target.begin(),Target.end());
		for(int i=0;i<=cnt2;i++){
			if(Visited[Target[i]]) continue;
			DFS_JHS(Target[i],Now);
		}	
	}
}
int main(){
	memset(Head,0,sizeof(Head));
	memset(Size,0,sizeof(Size));
	int m;
	int In1,In2;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&In1,&In2);
		Edge_Add(In1,In2);
		Edge_Add(In2,In1);
		Size[In1]++;
		Size[In2]++;
	}
	if(m==n-1){
		DFS(Start,Start);
	}
	if(m==n){
		TopSort();
		DFS_JHS(Start,Start);
	}
	for(int i=1;i<=cnt;i++) printf("%d ",Line[i]);
	return 0;
}
2023/10/10 20:44
加载中...