您的位置:首页 > 其它

1021. Deepest Root (25) @ PAT (Advanced Level) Practise

2013-08-25 11:23 465 查看
思路:

这题不难,主要就是深度优先搜索DFS算法。从每个点形如进行DFS,如果一次DFS后没有全部访问到,则用DFS0(简化版)遍历全部节点,并计算连通分量(components);如果全访问到了,记录maxDepth,并从下一个点开始继续DFS。

不过这题应该有什么优化方法吧,尽管没什么优化就AC了。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N;
vector<vector<int>> G;//graph
vector<bool> city;//visited
vector<int > depth;
int maxDepth;
int components=1;
void DFS(int i,int d)
{
if(d>maxDepth)
maxDepth=d;
d++;
city[i]=true;
vector<int>::iterator it;
for(it=G[i].begin();it!=G[i].end();it++)
{
if(!city[*it])
{
DFS(*it,d);
}
}
d--;
return ;
}
void DFS0(int i)
{
city[i]=true;
vector<int>::iterator it;
for(it=G[i].begin();it!=G[i].end();it++)
{
if(!city[*it])
{
DFS0(*it);
}
}
return;
}
int main()
{
cin>>N;
city.resize(N);
depth.resize(N);
G.resize(N);
int a,b;
for(int i=0;i<N-1;i++)
{
cin>>a>>b;
G[a-1].push_back(b-1);
G[b-1].push_back(a-1);
}

for(int i=0;i<N;i++)
{
maxDepth=0;
city.assign(N,false);
DFS(i,0);
while(true)
{
bool allVisited=true;
int j=1;
for(;j<city.size();j++)
{
if(city[j]==false)
{
allVisited=false;
break;
}
}
if(!allVisited)
{
components++;
DFS0(j);
}
else
{
break;
}
}
if(components!=1)
{
cout<<"Error: "<<components<<" components";
return 0;
}
depth[i]=maxDepth;
}
maxDepth=*max_element(depth.begin(),depth.end());
for(int i=0;i<N;i++)
{
if(depth[i]==maxDepth)
{
cout<<(i+1)<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: