zoukankan      html  css  js  c++  java
  • T103440 【模板】缩点

    题目地址


    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int MAXN=1e5,MAXM=1e6;
    struct Edge{
    	int from,to,nxt;
    }e[MAXM];
    int head[MAXN],edgeCnt=1;
    void addEdge(int u,int v){
    	e[++edgeCnt].from=u;
    	e[edgeCnt].to=v;
    	e[edgeCnt].nxt=head[u];
    	head[u]=edgeCnt;
    }
    int dfn[MAXN],low[MAXN],dfnCnt=0;
    int stck[MAXN],top=0;
    bool inStck[MAXN];
    int inScc[MAXN],sccCnt=0;
    int pointVal[MAXN];
    int sumVal[MAXN];
    void tarjan(int x){
    	dfn[x]=low[x]=++dfnCnt;
    	stck[++top]=x;
    	inStck[x]=1;
    	for(int i=head[x];i;i=e[i].nxt){
    		int nowV=e[i].to;
    		if(!dfn[nowV]){
    			tarjan(nowV);
    			low[x]=min(low[x],low[nowV]);
    		}else if(inStck[nowV]){
    			low[x]=min(low[x],dfn[nowV]);
    		}
    	}
    	if(low[x]==dfn[x]){
    		int y;
    		sccCnt++;
    		do{
    			y=stck[top--];
    			inScc[y]=sccCnt;
    			inStck[y]=0;//
    			sumVal[sccCnt]+=pointVal[y];//
    		}while(x!=y);
    	}
    }
    bool vis[MAXN];
    int main(){
    	int n,m;
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)
    		scanf("%d",&pointVal[i]);
    	for(int i=1;i<=m;i++){
    		int u,v;
    		scanf("%d%d",&u,&v);
    		addEdge(u,v);
    	}
    	for(int i=1;i<=n;i++)
    		if(!dfn[i])
    			tarjan(i);
    	for(int i=1;i<=n;i++){
    		if(!vis[inScc[i]]){
    			vis[inScc[i]]=1;
    			printf("%d
    ",sumVal[inScc[i]]);
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    XCode Playground Overview
    Swift开发学习(二):Playground
    swift网址
    swift关于is和as的解释
    Swift之 ? 和 !
    Swift 学习之二十一:?和 !(详解)
    Swift学习三
    Makefile project
    20171110面试笔记 服务器端程序员+C/C++开发
    关键字
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/11742131.html
Copyright © 2011-2022 走看看