【PAT Advanced Level】1021. Deepest Root (25)
2013-11-06 15:19
387 查看
这题分两个步骤:
1. 求出图中有几个连通子图
2. 如果只有一个连通图,找出最长的路径(图的直径)
我直接用了一个DFS求连通子图的个数,其实更通用的方法是并查集。
找出最长路径,我们进行了n次DFS,每次以一个节点作为根节点。后来看了网上的解法,其实只需要两次DFS就可以求得。
昨天我刚刚看了怎么求树的直径,今天该用到的时候又忘了,真是学的不牢啊。具体求法见/article/10183058.html
1. 求出图中有几个连通子图
2. 如果只有一个连通图,找出最长的路径(图的直径)
我直接用了一个DFS求连通子图的个数,其实更通用的方法是并查集。
找出最长路径,我们进行了n次DFS,每次以一个节点作为根节点。后来看了网上的解法,其实只需要两次DFS就可以求得。
昨天我刚刚看了怎么求树的直径,今天该用到的时候又忘了,真是学的不牢啊。具体求法见/article/10183058.html
//一次DSF即可 #include <iostream> #include <vector> #include <algorithm> #include <fstream> using namespace std; int num; vector<vector<int>> adj; vector<int> visited; vector<int> deepest; vector<int> distances; int connected = 0; void DSF_VISIT(int i) { visited[i] = 1; for(int j = 0; j < adj[i].size(); j++) { if(!visited[adj[i][j]]) { distances[adj[i][j]] = distances[i] + 1; DSF_VISIT(adj[i][j]); } } visited[i] = 2; } void DSF() { for(int i = 1; i <= num; i++) { if(!visited[i]) { DSF_VISIT(i); connected++; } } } int main() { //fstream cin("a.txt"); cin>>num; int tmp = num - 1; adj.assign(num + 1, vector<int>()); visited.assign(num + 1, 0); deepest.assign(num + 1, 0); distances.assign(num + 1, 0); int a,b; while (tmp--) { cin>>a>>b; adj[a].push_back(b); adj[b].push_back(a); } DSF(); if(connected > 1) cout<<"Error: "<<connected<<" components"<<endl; else { for(int i = 1; i <= num; i++) { visited.assign(num + 1, 0); distances.assign(num + 1, 0); DSF_VISIT(i); vector<int>::iterator it = max_element(distances.begin(), distances.end()); deepest[i] = *it; } vector<int>::iterator it = max_element(deepest.begin(), deepest.end()); for(int i = 1; i < deepest.size(); i++) { if(deepest[i] == *it) cout<<i<<endl; } } }
相关文章推荐
- PAT (Advanced Level) Practise 1021 Deepest Root (25)
- PAT (Advanced Level) Practise 1021. Deepest Root (25)
- 1021. Deepest Root (25) @ PAT (Advanced Level) Practise
- 【PAT】【Advanced Level】1021. Deepest Root (25)
- 浙大 PAT Advanced level 1021. Deepest Root (25)
- PAT (Advanced Level) Practise 1021. Deepest Root (25)
- PAT (Advanced Level)1021. Deepest Root (25)
- PAT (Advanced Level) Practise 1021 Deepest Root (25)
- Pat(Advanced Level)Practice--1021(Deepest Root)
- 1075. PAT Judge (25)【排序】——PAT (Advanced Level) Practise
- 【PAT】【Advanced Level】1007. Maximum Subsequence Sum (25)
- PAT (Advanced Level) Practise 1117 Eddington Number(25)
- PAT (Advanced Level) Practise 1012. The Best Rank (25)
- PAT (Advanced Level) Practise 1052 Linked List Sorting (25)
- 【PAT】【Advanced Level】1056. Mice and Rice (25)
- PAT (Advanced Level) Practise 1090 Highest Price in Supply Chain (25)
- PAT (Advanced Level) 1002. A+B for Polynomials (25) 合并同类项
- PAT (Advanced Level) 1009. Product of Polynomials (25) 多项式相乘
- PAT (Advanced Level) 1033. To Fill or Not to Fill (25)最省加油方案,贪心算法
- PAT (Advanced Level) 1043. Is It a Binary Search Tree (25) 判断序列是否为BST的先序遍历,递归