有两份代码,一份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;
}