多校第三场:hdu4324(判三角形的有向环)

题意:在图中找三角形的有向环。

先选出一部分的边建一棵树,判断剩下的边加进去是否出现环。

#include <vector>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int M=2005;
struct NN
{
    int v;
    int vis;
};
vector<NN>edge[M];
int fa[M];
int n;
int vist[M];

void dfs(int u)
{
    vist[u]=1;
    for(int i=0;i<edge[u].size();i++)
    {
        int vv=edge[u][i].v;
        if(vist[vv]==0)
        {
           fa[vv]=u;
           edge[u][i].vis=1;
           dfs(vv);
        }
    }
}
int ca=1;
void judge()
{
     cout<<"Case #"<<ca++<<": ";
      for(int i=1;i<=n;i++)
      {
          for(int j=0;j<edge[i].size();j++)
          {
              if(edge[i][j].vis==0)
              {
                  if(fa[fa[i]]==edge[i][j].v)
                  {
                     puts("Yes");
                     return ;
                  }
              }
          }
      }
      puts("No");
}
char str[M][M];

int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        fa[i]=i,vist[i]=0,edge[i].clear();

      NN ne;
      int root=-1;
      for(int i=0;i<n;i++)
        scanf("%s",str[i]);

      for(int i=0;i<n;i++)
      {
          for(int j=0;j<n;j++)
          {
            if(str[i][j]=='1')
            {
              ne.v=j+1;
              ne.vis=0;
              edge[i+1].push_back(ne);
              if(root=-1)
              root=i+1;
            }
          }
      }
      for(int i=1;i<=n;i++)
      if(vist[i]==0)
      dfs(root);
      judge();
    }
    return 0;
}

你可能感兴趣的:(struct,ini)