RT,只有60pts,思路:由于是字典序,所以可以贪心,当前选择最小的一定是最优的。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<string>
#include<cstring>
#include<ctime>
#include<fstream>
#include<sstream>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define TYPE int
int n,m,cnt,head[5005];
bool vis[5005];
struct edge{
int v,nxt;
}e[10005];
inline TYPE read(){
TYPE x=0,f=1;
char ch=getchar();
while((ch<'0'||ch>'9')){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
return x*f;
}
inline void add(int u,int v){
e[++cnt]=(edge){v,head[u]},head[u]=cnt;
}
inline void dfs(int x){
if(vis[x]) return;//防止环的情况,避免“本来可以遍历,但是被另一个结点给遍历了”的情况
vis[x]=1;//标记
printf("%d ",x);//输出
priority_queue<int,vector<int>,greater<int> > q;//优先队列
while(!q.empty()) q.pop();//防止出现奇怪的东西
for(int i=head[x];i;i=e[i].nxt){
int v=e[i].v;
if(!vis[v]) q.push(v);//可以遍历的都扔进来
}
while(!q.empty()) dfs(q.top()),q.pop(); //一个一个遍历
}
int main(){
n=read(),m=read();
for(int i=1,u,v;i<=m;i++) u=read(),v=read(),add(u,v),add(v,u);
dfs(1);//贪心
return 0;
}
``