关于如何排序 起点排序为何不行
查看原帖
关于如何排序 起点排序为何不行
360297
MICRO_12138楼主2020/11/12 16:23
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
vector<int> arr[100001];
//arr[a][b]=c
//a的第b条边是 a指向c
bool isvisited[100001];
struct edge{
	int s;
	int e;
};
vector<edge> E;
struct cmp{
	//果真是这里出现了问题
	bool operator()(const edge & s1,const edge & s2)const{
		if(s1.s==s2.s)	return s1.e<s1.e;
		else	return s1.s<s2.s;
	}
};
void dfs(int s);
void bfs(int s);
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int temp1,temp2;
		cin>>temp1>>temp2;
		E.push_back(edge{temp1,temp2});
	}
	sort(E.begin(),E.end(),cmp());
	//cout<<E[0].s<<' '<<E[0].e<<endl;
	for(int i=0;i<m;i++){
		arr[E[i].s].push_back(E[i].e);
	}
	dfs(1);
	cout<<endl;
	memset(isvisited,0,sizeof(isvisited));
	bfs(1);
	cout<<endl;
	return 0;
}
void dfs(int s){
	if(isvisited[s])	return ;
	isvisited[s]=1;
	cout<<s<<' ';
	int len=arr[s].size();
	for(int i=0;i<len;i++){
		dfs(arr[s][i]);
	}
}
void bfs(int s){
	queue<int> que;
	isvisited[s]=1;
	que.push(s);
	while(!que.empty()){
		int top=que.front();
		cout<<top<<' ';
		que.pop();
		int len=arr[top].size();
		for(int i=0;i<len;i++){
			if(!isvisited[arr[top][i]]){
				isvisited[arr[top][i]]=1;
				que.push(arr[top][i]);
			}
		}
	}
}	

我觉得在排序结构体cmp里 只要保证每一个起点的对应终点有序就行了,即按照上述代码,一开始我的想法是错误的,起点有序,可为什么不对呢? 我已经知道正确做法 即 终点排序

bool operator()(const edge & s1,const edge & s2)const{
		if(s1.e==s2.e)	return s1.s<s1.s;
		else	return s1.e<s2.e;
	}
2020/11/12 16:23
加载中...