您的位置:首页 > 编程语言 > C语言/C++

C++ P1137 旅行计划

2016-11-17 15:24 387 查看
题目:P1137 旅行计划

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

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

# include <iostream>
# include <vector>
# include <stack>
using namespace std;
int n, m, dis[100010], du[100010], u, v;
vector<int> map[100010];
stack<int> 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息