C++ P1137 旅行计划

题目:P1137 旅行计划

一开始做法是从入度为0的点开始DFS找最长路,但不知道哪错了(还有超时),然后用了一下拓扑排序。

因为它走的路径遵循一个规律:只往东边走,所以可以用拓扑排序,给出代码。

# include 
# include 
# include 
using namespace std;
int n, m, dis[100010], du[100010], u, v;
vector map[100010];
stack strat;
int main() {
	cin >> n >> m;
	while(m--) {
		cin >> u >> v;
		map[u].push_back(v); // 单向储存边
		du[v]++; // 记录各点入度
	}
	for(int i = 1; i <= n; i++) if(du[i] == 0) {
		dis[i] = 1; // 到本身城市距离为1
		strat.push(i); // 进栈
	}
	while(!strat.empty()) { // 栈不为空时
		u = strat.top(); // 取出栈顶部元素
		strat.pop(); // 删除栈顶部元素
		for(int i = 0; i < map[u].size(); i++) { // 访问u的每条边
			v = map[u][i];
			dis[v] = max(dis[v], dis[u] + 1); // dp更新最长距离
			du[v]--; // 该点的入度-1
			if(du[v] == 0) strat.push(v); // 如果再有入度为0的点,则入栈
		}
	}
	for(int i = 1; i <= n; i++) cout << dis[i] << endl;
	return 0;
}


你可能感兴趣的:(洛谷题库)