首先对于前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 }