zoukankan      html  css  js  c++  java
  • CF 949C Data Center Maintenance——思路+SCC

    题目:http://codeforces.com/contest/949/problem/C

    可以想到可能是每组c有连边的可能。

    但别直接给c1、c2连边,那样之后会变得很不好做。

    可以把一些限制放在连边这个环节上。

    也就是只有(c1+1)%h==c2才从c1向c2连边表示选了c1必须选c2!c2向c1也是一样。

    然后缩个点找无出度的最小的点就行了。

    边注意开成两倍——一组c也可能连两条边,%2之类的。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N=1e5+5;
    int n,m,h,a[N],hd[N],xnt,dfn[N],low[N],tim;
    int stack[N],top,cnt,col[N],siz[N],cd[N],ans=0x3f3f3f3f,prn;
    bool ins[N];
    struct Ed{
      int nxt,fr,to;
      Ed(int n=0,int f=0,int t=0):nxt(n),fr(f),to(t) {}
    }ed[N<<1];//!!!有可能(%2,一个c连两条边) 
    void add(int x,int y)
    {
      ed[++xnt]=Ed(hd[x],x,y);hd[x]=xnt;
    }
    void tarjan(int cr,int f)
    {
      dfn[cr]=low[cr]=++tim;
      stack[++top]=cr;ins[cr]=1;
      for(int i=hd[cr],v;i;i=ed[i].nxt)
        if(ins[v=ed[i].to])low[cr]=min(low[cr],dfn[v]);//directed edge,don't worry fa
        else if(!dfn[v])tarjan(v,cr),low[cr]=min(low[cr],low[v]);
      if(dfn[cr]==low[cr])
        {
          cnt++;
          while(stack[top]!=cr)col[stack[top]]=cnt,ins[stack[top--]]=0,siz[cnt]++;
          top--;col[cr]=cnt;ins[cr]=0;siz[cnt]++;
        }
    }
    int main()
    {
      scanf("%d%d%d",&n,&m,&h);
      for(int i=1;i<=n;i++)scanf("%d",&a[i]);
      int x,y;
      for(int i=1;i<=m;i++)
        {
          scanf("%d%d",&x,&y);
          if((a[x]+1)%h==a[y])add(x,y);if((a[y]+1)%h==a[x])add(y,x);
        }
      for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);
      for(int i=1,v;i<=xnt;i++)
        if((v=col[ed[i].fr])!=col[ed[i].to])cd[v]++;
      for(int i=1;i<=cnt;i++)
        if(!cd[i]&&siz[i]<ans)ans=siz[i],prn=i;
      printf("%d
    ",ans);
      for(int i=1;i<=n;i++)
        if(col[i]==prn)printf("%d ",i);
      return 0;
    }
  • 相关阅读:
    搜索回车跳转页面
    登录验证码
    【排序算法】排序算法之插入排序
    PAT 乙级 1044 火星数字 (20 分)
    PAT 甲级 1035 Password (20 分)
    PAT 甲级 1041 Be Unique (20 分)
    PAT 甲级 1054 The Dominant Color (20 分)
    PAT 甲级 1027 Colors in Mars (20 分)
    PAT 甲级 1083 List Grades (25 分)
    PAT 甲级 1005 Spell It Right (20 分)
  • 原文地址:https://www.cnblogs.com/Narh/p/9278730.html
Copyright © 2011-2022 走看看