C++ P1137 旅行计划
2016-11-17 15:24
387 查看
题目:P1137 旅行计划
一开始做法是从入度为0的点开始DFS找最长路,但不知道哪错了(还有超时),然后用了一下拓扑排序。
因为它走的路径遵循一个规律:只往东边走,所以可以用拓扑排序,给出代码。
一开始做法是从入度为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; }