萌新求助,为啥只有m=n-1的点过了
查看原帖
萌新求助,为啥只有m=n-1的点过了
172370
fzj2007楼主2020/10/3 15:45

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;
}

``
2020/10/3 15:45
加载中...