2 条题解

  • -1
    @ 2022-4-19 22:40:32

    严禁抄题解,发现后取消成绩

    • -2
      @ 2022-4-5 23:55:07

      做法1:(1)两次dfs(不适用于负边权)

      首先从任意节点c开始进行第一次 DFS,到达距离其最远的节点,记为z1,然后再从z1 开始做第二次 DFS,到达距离z1最远的节点,记为z2,则(z1,z2)即为树的直径。(具体证明可参考OI WIKI)

      
      #include<bits/stdc++.h>
      using namespace std;
      int n,de[105],c,u,v;
      vector<int> e[105];
      void dfs(int u,int fa)
      {
      	for(int i=0;i<e[u].size();i++)
      	{
      		int v=e[u][i];
      		if(v==fa) continue;
      		de[v]=de[u]+1;
      		if(de[v]>de[c])
      		{
      			c=v;
      		} 
      		dfs(v,u);
      	} 
      }
      int main()
      {
      	ios::sync_with_stdio(false);
      	cin.tie(0);
      	cin>>n;
      	for(int i=1;i<n;i++)
      	{
      		cin>>u>>v;
      		e[u].push_back(v);
      		e[v].push_back(u);
      	}
      	dfs(1,0);
      	de[c]=0;
      	dfs(c,0);
      	cout<<de[c];
      	return 0;
      }  
      
      • 1

      信息

      ID
      1168
      时间
      1000ms
      内存
      128MiB
      难度
      1
      标签
      递交数
      49
      已通过
      34
      上传者