数据过水
查看原帖
数据过水
565265
I_will_AKIOI我心依旧楼主2024/9/30 22:54

或许是由于洛谷评测机过快的原因,我 O(nR2)O(nR^2) 的代码竟然轻松通过了本题,请求加强数据。

https://www.luogu.com.cn/record/179165385

#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
#define N 100005
#define M 105
using namespace std;
int n,m,ans1,ans2=1e9,f[N][M],pre[N][M],suf[N][M];
vector<pair<int,int> >v[N];
void dfs1(int k,int fa)
{
  for(auto now:v[k])
  {
    if(now.first==fa) continue;
    if(now.second==0) ans1=(ans1*(m-1))%mod;
    if(now.second==1) ans1=(ans1*m)%mod;
    dfs1(now.first,k);
  }
  return;
}

void dfs2(int k,int fa)
{
  for(int i=1;i<=m;i++) f[k][i]=i;
  for(auto now:v[k])
  {
    if(now.first==fa) continue;
    dfs2(now.first,k);
    if(now.second==0)
    {
      for(int i=1;i<=m;i++)
      {
        int minn=1e9;
        for(int j=1;j<=m;j++) if(i!=j) minn=min(minn,f[now.first][j]);
        f[k][i]+=minn;
      }
    }
    if(now.second==1)
    {
      for(int i=1;i<=m;i++)
      {
        int minn=1e9;
        for(int j=1;j<=m;j++) minn=min(minn,f[now.first][j]);
        f[k][i]+=minn;
      }
    }
    if(now.second==2)
    {
      for(int i=1;i<=m;i++) f[k][i]+=f[now.first][i];
    }
  }
  return;
}

signed main()
{
  ios::sync_with_stdio(0);
  cin>>n>>m;
  for(int i=1;i<n;i++)
  {
    int x,y,z;
    cin>>x>>y>>z;
    v[x].push_back({y,z});
    v[y].push_back({x,z});
  }
  ans1=m;
  dfs1(1,0);
  if(ans1==0)
  {
    cout<<0<<" "<<0;
    return 0;
  }
  dfs2(1,0);
  for(int i=1;i<=m;i++) ans2=min(ans2,f[1][i]);
  cout<<ans1<<" "<<ans2;
  return 0;
}
2024/9/30 22:54
加载中...