P5022 旅行

首先对于前60分的数据,由题意很明显能判断出是一个树,从1号点开始以贪心思维dfs就行了

附上60分代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<stack>
 7 #include<deque>
 8 #include<algorithm>
 9 #define ll long long
10 using namespace std;
11 const int oo=0x3f3f3f3f;
12 const int N=50005;
13 
14 int n,m,tot;
15 int head[N],next[N],to[N];
16 
17 void dfs(int u,int fa){
18     printf("%d ",u);
19     int num=0,a[N];
20     for(int i=head[u];i;i=next[i]){
21         a[++num]=to[i];
22     }
23     sort(a+1,a+1+num);
24     for(int i=1;i<=num;i++){
25         if(a[i]!=fa) dfs(a[i],u);
26     }
27 }
28 
29 int Min(int a,int b){return a<b?a:b;}
30 int Max(int a,int b){return a>b?a:b;}
31 int Abs(int a){return a>0?a:-a;}
32 
33 int get(){
34     char zy=getchar();
35     int z=1,y=0;
36     while(zy>'9'||zy<'0'){
37         if(zy=='-') z=-1;
38         zy=getchar();
39     }
40     while(zy>='0'&&zy<='9'){
41         y=(y<<1)+(y<<3)+zy-'0';
42         zy=getchar();
43     }
44     return z*y;
45 }
46 
47 void add(int u,int v){
48     next[++tot]=head[u];
49     head[u]=tot;
50     to[tot]=v;
51 }
52 
53 int main(){
54     n=get();m=get();
55     for(int i=1;i<=m;i++){
56         int u=get(),v=get();
57         add(u,v);add(v,u);
58     }
59     if(m==n-1) dfs(1,1);
60     return 0;
61 }

那么对于全部数据,很明显就是在原树上加一条边,形成一个唯一环,而此环上n个条边只有n-1条边会被访问到,所以删边就可以了

附上吸氧过后满分代码(真没办法。。)

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<vector>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=10010;
 7 int a[N],b[N];
 8 int ans[N],k[N]; 
 9 int vist[N];
10 int n,m,x,y,number;
11 vector<int>vt[N];
12 
13 int get(){
14     char zy=getchar();
15     int z=1,y=0;
16     while(zy>'9'||zy<'0'){
17         if(zy=='-') z=-1;
18         zy=getchar();
19     }
20     while(zy>='0'&&zy<='9'){
21         y=(y<<1)+(y<<3)+zy-'0';
22         zy=getchar();
23     }
24     return z*y;
25 }
26 
27 void sw(){
28     ans[0]=1;
29     for(int i=1;i<=n;i++) ans[i]=k[i];
30 }
31 
32 void com(){
33     for(int i=1;i<=n;i++){
34         if(ans[i]<k[i]) break;
35         if(k[i]<ans[i]){ sw();break; }
36     }
37 }
38 
39 void init(){
40     n=get();m=get();
41     for(int i=1;i<=m;i++){
42         int u=get(),v=get();
43         a[i]=u;b[i]=v;
44         vt[u].push_back(v);
45         vt[v].push_back(u);
46     }
47     for(int i=1;i<=n;i++) sort(vt[i].begin(),vt[i].end());
48 }
49 
50 void dfs(int t,int last){
51     if(vist[t]==1) return ;
52     vist[t]=1;
53     number++;
54     k[number]=t;
55     for(int i=0;i<vt[t].size();i++)
56     {
57         int s=vt[t][i];
58         if((t==x&&s==y)||(t==y&&s==x)||(s==last)) continue;
59         dfs(s,t);
60     }
61     vist[t]=0;
62 }
63 
64 void dfn(){
65     for(int i=1;i<=m;i++){
66         number=0;
67         x=a[i];y=b[i];
68         dfs(1,0);
69         if(number==n) ans[0]==0?sw():com();
70     }
71 }
72 void dfs2(int t,int last){
73     if(vist[t]==1) return ;
74     vist[t]=1;
75     number++;
76     k[number]=t;
77     for(int i=0;i<vt[t].size();i++)
78     {
79         int s=vt[t][i];
80         if(s==last) continue;
81         dfs2(s,t);
82     }
83     vist[t]=0;
84 }
85 
86 int main(){
87     init();
88     if(m==n-1) dfs2(1,0),sw();
89     else dfn();
90     for(int i=1;i<=n;i++) printf("%d ",ans[i]);
91     return 0;
92 }
原文地址:https://www.cnblogs.com/hahaha2124652975/p/11650865.html