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

    题目地址


    易错点:

    • 出栈时应将inStck[y]置空.

    #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;
    }
  • 相关阅读:
    POJ1112 Team Them Up!
    WebSocket相关介绍
    长轮询 & 短轮询
    图片上传 & 预览
    sessionStorage & localStorage & cookie & session
    进程 & 线程
    https介绍与讲解
    http请求
    TCP/IP的连接与断开
    浏览器缓存
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/11680501.html
Copyright © 2011-2022 走看看