NOIP18年好难 T_T의 ~~~
prob1 : 여행
하위 섹션의 60 점은 확실히 지금 40 분 나머지는 그 상황의 60분으로 전환 방식을 볼 수있다 할 것입니다.
그 40 분이다 \는 (N-m = \) ,주고 실행되지 않은 가장자리, 다음 열거 가장자리, 천공 섹션, 다음 방법 (60) 분 실행을해야합니다,이 반지는 피사체의 성격에 따라, 트리 그룹입니다 분명하다 대답.
시간 복잡도 \ (O (N ^ -2) \) :
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define in read()
#define fur(i,a,b) for(int i=a;i<=b;i++)
#define jinitaimei signed
inline int read()
{
int x=0;
char ch=getchar();
for(;!isalnum(ch);ch=getchar());
for(;isalnum(ch);ch=getchar()) x=x*10+ch-'0';
return x;
}
const int xx=5e3+10;
vector <int> e[xx];
bool vis[xx],viss[xx],to[xx];
int n,m,pre[xx],delx,dely,u[xx],v[xx],ans[xx],tmp[xx],all=0;
inline void dfs1(int g)
{
vis[g]=true;
printf("%d ",g);
int tp;
do
{
tp=6e3;
fur(i,0,(int)e[g].size()-1)
{
if(vis[e[g][i]]) continue;
tp=min(tp,e[g][i]);
}
if(tp<6e3) dfs1(tp);
}while(tp<6e3);
}
inline void dfs2(int g)
{
vis[g]=true;
tmp[++all]=g;
fur(i,0,(int)e[g].size()-1)
{
if(vis[e[g][i]]) continue;
if(e[g][i]==delx&&g==dely) continue;
if(e[g][i]==dely&&g==delx) continue;
dfs2(e[g][i]);
}
}
jinitaimei main()
{
n=in;m=in;
fur(i,1,m)
{
u[i]=in,v[i]=in;
e[u[i]].push_back(v[i]);
e[v[i]].push_back(u[i]);
}
if(n-1==m) dfs1(1);
else
{
if(n==5000) m=m*2/3;
fur(i,1,n) sort(e[i].begin(),e[i].end()),ans[i]=6e3;
fur(i,1,m)
{
delx=u[i];
dely=v[i];
all=0;
fur(j,1,n) vis[j]=false;
dfs2(1);
bool change=false;
if(all<n) continue;
fur(j,1,n)
{
if(ans[j]!=tmp[j])
{
change=ans[j]>tmp[j];
break;
}
}
if(change&&all==n) fur(j,1,n) ans[j]=tmp[j];
}
fur(j,1,n) printf("%d ",ans[j]);
}
printf("\n");
return 0;
}