比赛

题目描述
经过千辛万苦,orez和mjw终于成功逃离了LG的追杀,来到了XD的地盘。XD为了迎接两位影星的到来,决定举行一场友谊比赛来迎接他们。这次比赛将这样进:每次orez和mjw都可以从参赛者中选择两个人进行比赛,败者将被淘汰,然后orez和mjw继续从剩余的人中选择两个人进行较量……直到只剩下一名参赛者时,比赛结束,最后一位选手将获得冠军。
  经过稍微的思考,orez和mjw似乎发现这场比赛有着明显的不公平性。由于赛前已经可以100%的预测某些选手之间的胜负关系,所以他们俩可以通过一定的选择顺序使得某个人获得冠军。这是一个很让他们俩振奋的结论!于是他们俩迫切的想知道到底有多少人可以通过他们的“特别关照”而稳获冠军,仁慈的你就帮帮他们吧。
  (注意:若一个人即使不需要“特别关照”也能绝对获得冠军,mjw和orez也认为是受了他们的帮助而获得冠军)
输入
文件第一行为一个整数T,为数据组数。
对于每个数据,第一行为一个整数n,代表参赛人数。
接下来n行,每i行第一个数为pi,接下来有pi个数,表示第i个人与这pi个人进行比赛必然会输。
输出
对于每个数据,输出一个整数ans,表示受他们“特别关照”能稳获冠军的人数。
样例输入
1
3
2 3 2
1 3
0
样例输出
1
提示
[数据范围]
对于30%的数据,n<=200,m<=1000,T<=5
对于100%的数据,n<=1000,m<=5000,T<=100

这题可以转化为一个图论模型:每个人看作一个点,如果a必然会输给b,就连一条从b到a的有向边。那么问题就转化为求有多少点满足以下条件:从这个点出发可以到达图中的任何一个点。那么可以想到一个朴素算法:枚举每个点并且用dfs或bfs检验它是否符合条件,这样的时间复杂度为O(nm),无法过全部数据。
注意到如果若干个点形成一个强连通子图,那么这些点可以看作同一个点。那么我们可以用O(m)的时间将每个的强连通子图都缩为一个点。这样缩环后的图就是一个有向无环图,如果这个图中有多个点入度为0,那么这多个点肯定不能互相到达,那么答案就是0;如果图中只有一个点入度为0,那么这个点出发肯定可以到达其它所有的点,那么这个点所代表的点的数目就是答案。

var
t,tot,i,j,n,m,x,time,top,num,ans,k,p:longint;
head,ret,next,dfn,low,stk,color,s,root,du,f:array[0..500000] of longint;
flag,flag_stk:array[0..500000] of boolean;
function min(a,b:longint):longint;
begin
  if a<b then exit(a) else exit(b);
end;

procedure ins(u,v:longint);
begin
  tot:=tot+1;
  ret[tot]:=v;
  next[tot]:=head[u];
  head[u]:=tot;
end;

procedure tarjan(u:longint);
var
i,v:longint;
begin
  time:=time+1;
  dfn[u]:=time;
  low[u]:=time;
  top:=top+1;
  stk[top]:=u;
  flag[u]:=true;
  flag_stk[u]:=true;
  i:=head[u];
  while i<>0 do
  begin
    v:=ret[i];
    if flag[v]=false then
    begin
      tarjan(v);
      low[u]:=min(low[u],low[v]);
    end
    else if flag_stk[v] then low[u]:=min(low[u],low[v]);
    i:=next[i];
  end;
  if dfn[u]=low[u] then
  begin
    num:=num+1;
    root[num]:=u;
    while stk[top]<>u do
    begin
      flag_stk[stk[top]]:=false;
      color[stk[top]]:=num;
      s[num]:=s[num]+1;
      top:=top-1;
    end;
    flag_stk[stk[top]]:=false;
    color[stk[top]]:=num;
    s[num]:=s[num]+1;
    top:=top-1;
  end;
end;

function find(i:longint):longint;
begin
  if f[i]<>i then f[i]:=find(f[i]);
  exit(f[i]);
end;

procedure union(x,y:longint);
var
root1,root2:longint;
begin
  root1:=find(x);
  root2:=find(y);
  if root1<>root2 then f[root1]:=root2;
end;

procedure dfs(u:longint);
var
i,v:longint;
begin
  flag[u]:=true;
  i:=head[u];
  while i<>0 do
  begin
    v:=ret[i];
    if flag[v]=false then
      if color[v]=color[u] then dfs(v) else begin flag[v]:=true; du[color[u]]:=du[color[u]]+1; union(color[u],color[v]); end;
    i:=next[i];
  end;
end;

begin
  readln(t);
  while t>0 do
  begin
    t:=t-1;
    readln(n);
    tot:=0;
    num:=0;
    top:=0;
    for i:=1 to n do
    begin
      head[i]:=0;
      flag[i]:=false;
      flag_stk[i]:=false;
      dfn[i]:=0;
      low[i]:=0;
      s[i]:=0;
      color[i]:=0;
      du[i]:=0;
    end;
    for i:=1 to n do
    begin
      read(m);
      for j:=1 to m do
      begin
        read(x);
        ins(i,x);
      end;
      readln;
    end;
    for i:=1 to n do
      if dfn[i]=0 then tarjan(i);
    for i:=1 to num do
      f[i]:=i;
    for i:=1 to num do
    begin
      fillchar(flag,sizeof(flag),false);
      dfs(root[i]);
    end;
    ans:=0;
    k:=0;
    p:=0;
    for i:=1 to num do
    begin
      if f[i]=i then k:=k+1;
      if du[i]=0 then begin p:=p+1; ans:=ans+s[i]; end;
    end;
    if k>1 then begin writeln('0'); continue; end;
    if p>1 then begin writeln('0'); continue; end;
    writeln(ans);
  end;
end.
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值