zoukankan      html  css  js  c++  java
  • Codevs1332_上白泽慧音_KEY

    题目传送门

    裸的模板题,Tarjan求联通量。

     code:

    #include <cstdio>
    #include <vector>
    #define min(a,b) a<b?a:b
    #define MAXN 5005
    using namespace std;
    int N,M,DFN[MAXN],vis[MAXN],stack[MAXN],LOW[MAXN];
    int nowt,top,clo[MAXN],clot,t[MAXN];
    vector<int>a[MAXN];
    void tarjan(int x){
        DFN[x]=LOW[x]=++nowt;
        stack[++top]=x;
        vis[x]=1;
            for(int i=0;i<a[x].size();i++){
                int to=a[x][i];
                if(!DFN[to]){
                    tarjan(to);
                    LOW[x]=min(LOW[x],LOW[to]);
                }
                else if(vis[to])LOW[x]=min(LOW[x],DFN[to]);
            }
        if(DFN[x]==LOW[x]){
            clot++;
            while(stack[top]!=x)clo[stack[top]]=clot,vis[stack[top--]]=0;
            clo[stack[top]]=clot;
            vis[stack[top--]]=0;
        }
    }
    int main(){
        scanf("%d%d",&N,&M);
            for(int i=1;i<=M;i++){
                int x,y,c;scanf("%d%d%d",&x,&y,&c);
                a[x].push_back(y);
                if(c>1)a[y].push_back(x);//双向边
            }
            for(int i=1;i<=N;i++){
                if(!DFN[i])tarjan(i);
            }
            for(int i=1;i<=N;i++)t[clo[i]]++;
        int j=0;
            for(int i=1;i<=N;i++)if(t[i]>t[j])j=i;printf("%d
    ",t[j]);
            for(int i=1;i<=N;i++)if(clo[i]==j)printf("%d ",i);
        return 0;
    }

    模板,加深印象

  • 相关阅读:
    error: with modifiers "public "
    移除元素
    删除有序数组中的重复项
    最长公共前缀
    如何杀死window进程
    IDEA卡顿问题
    合并两个有序链表
    开闭原则
    字符集和sql语句GROUPBY查询的版本问题
    里氏替换原则
  • 原文地址:https://www.cnblogs.com/Cptraser/p/7905267.html
Copyright © 2011-2022 走看看