3 条题解

  • 2
    @ 2022-12-8 21:08:49
    #include<bits/stdc++.h>
    #define endl "\n"
    using namespace std;
    vector<int> e[100005];
    bool vis[100005];//用于找根节点 
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	int n,m;
    	cin>>n>>m;
    	for(int i=1;i<=m;i++)
    	{
    		int x,y;
    		cin>>x>>y;
    		e[x].push_back(y);
    		vis[y]=1; 
    	}
    	int maxx=1;
    	for(int i=1;i<=n;i++)
    	{
    		sort(&e[i][0],&e[i][e[i].size()]);//对子节点排序 
    		if(e[i].size()==e[maxx].size())
    			if(i<maxx) maxx=i;//取较小的节点 
    		if(e[i].size()>e[maxx].size())
    			maxx=i;
    	}
    	int ans;
    	for(int i=1;i<=n;i++)
    		if(vis[i]==0)
    			ans=i;
    	cout<<ans<<endl;
    	cout<<maxx<<endl;
    	for(int i=0;i<e[maxx].size();i++)
    		cout<<e[maxx][i]<<" ";
    	return 0;
    }
    
    • 2
      @ 2022-12-8 20:27:53
      #include <bits/stdc++.h>
      using namespace std;
      int n, m;
      int x[205], y[205]; //第i条边的起点是 x[i] 终点是 y[i]
      int cnt[205];     //统计每个节点有多少孩子
      int ch[205], tot; //有tot个孩子,分别是 ch[1]~ch[tot]
      int main()
      {
          ios::sync_with_stdio(false);
          cin.tie(0);
          cin >> n >> m;
          for (int i = 1; i <= m; i++)
              cin >> x[i] >> y[i];
          //找根
          int root = (1 + n) * n / 2;
          for (int i = 1; i <= m; i++)
              root -= y[i];
          //找孩子最多的节点
          for (int i = 1; i <= m; i++)
              cnt[x[i]]++;
          int maxI = 1;
          for (int i = 2; i <= n; i++)
              if (cnt[i] > cnt[maxI])
                  maxI = i;
          //找到maxI的所有孩子
          tot = 0;
          for (int i = 1; i <= m; i++)
              if (x[i] == maxI)
              {
                  tot++;
                  ch[tot] = y[i];
              }
          sort(ch + 1, ch + tot + 1);
          //输出
          cout << root << endl;
          cout << maxI << endl;
          for (int i = 1; i <= tot; i++)
              cout << ch[i] << " ";
          return 0;
      }
      
      • 1
        @ 2022-12-8 20:56:34

        vecotr动态数组写法

        #include<bits/stdc++.h>
        using namespace std;
        int m,n;   //m边 n节点
        vector<int> e[110];
        bool pd[110];
        int main()
        {
        	cin>>n>>m;
        	int father,son;  //输入用 
        	for(int i=1;i<=m;i++)
        	{
        		cin>>father>>son;
        		e[father].push_back(son);
        		pd[son]=1;
        	}
        	int gen;  //存储根节点 
        	for(int i=1;i<=n;i++)
        		if(pd[i]==0)
        		{
        			gen=i;
        			cout<<gen<<'\n';
        			break;
        		}//找根节点
        	int maxx=0,pos;  //存储 拥有 最多子节点 的 节点,以及节点的位置 
        	for(int i=1;i<=n;i++)
        	{
        		if(e[i].size()>maxx)
        		{
        			maxx=(int)e[i].size();
        			pos=i;
        		}
        	}  //找最多子节点
        	cout<<pos<<'\n';
        	sort(e[pos].begin(),e[pos].end());  //要求按照从小到大输出 
        	for(int i=0;i<(int)e[pos].size();i++)
        		cout<<e[pos][i]<<" ";
        	return 0;
        }
        
        • 1

        信息

        ID
        555
        时间
        1000ms
        内存
        128MiB
        难度
        3
        标签
        (无)
        递交数
        72
        已通过
        37
        上传者