zoukankan      html  css  js  c++  java
  • codevs 1506 传话

    这题仿佛暴力都能过。。。我还是写的tarjan。

    纯粹是裸的找环,每个点所属的强连通分量只要大于一个点,依据定义就肯定有环。

    #include<iostream>
    #include<cstdio>
    #include<stack>
    #include<vector>
    #include<cstring>
    #define maxv 1005
    #define maxe 100005
    using namespace std;
    stack <int> s;
    int n,m,g[maxv],x,y,nume=0,cntv=0,times=0;
    int belong[maxv],low[maxv],dfn[maxv];
    vector <int> v[505];
    bool vis[maxv],ins[maxv];
    struct edge
    {
     int v,nxt;
    }e[maxe];
    void addedge(int u,int v)
    {
     e[++nume].v=v;
     e[nume].nxt=g[u];
     g[u]=nume;
    }
    void tarjan(int u)
    {
     ++times;
     dfn[u]=times;
     low[u]=times;
     s.push(u);
     vis[u]=true;
     ins[u]=true;
     for (int i=g[u];i;i=e[i].nxt)
     {
      int v=e[i].v;
      if (vis[v]==false)
      {
       tarjan(v);
       low[u]=min(low[u],low[v]);
      }
      else if (ins[v]==true)
       low[u]=min(low[u],dfn[v]);
     }
     if (dfn[u]==low[u])
     {
      int vtx;cntv++;
      do
      {
       vtx=s.top();
       s.pop();
       belong[vtx]=cntv;
       v[cntv].push_back(vtx);
       ins[vtx]=false;
      }
      while (vtx!=u);
     }
    }
    int main()
    {
     memset(vis,false,sizeof(vis));
     memset(ins,false,sizeof(ins));
     scanf("%d%d",&n,&m);
     for (int i=1;i<=m;i++)
     {
      scanf("%d%d",&x,&y);
      addedge(x,y);
     }               
     for (int i=1;i<=n;i++)
      if (vis[i]==false)
       tarjan(i);
     for (int i=1;i<=n;i++)
     {
      if (v[belong[i]].size()>1)
       printf("T ");
      else printf("F ");
     }
     return 0;
    }

  • 相关阅读:
    前端万字面经——进阶篇
    canvas 爬坑路【属性篇】
    Linux下提权反弹脚本
    修改和重置WAMP的phpMyAdmin密码
    如何调试Apache的URL重写(转载收藏)
    sharepoint 计算列的公式
    SharePoint控件的使用
    快速查看dll的PublicToken。
    DataCogsFieldControls 有时保存不上的问题
    遍历文件中的资源
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5154896.html
Copyright © 2011-2022 走看看