#include<stdio.h> #include<string.h> #define N 51000 #define inf 1000000000 struct node { int u,v,w,next; }bian[N*2]; int dfn[N],low[N],yong,index,ans[N],visit[N],head[N],stac[N],top,num,n; void init() { yong=0;index=0;top=0;num=0; memset(head,-1,sizeof(head)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(visit,0,sizeof(visit)); memset(stac,0,sizeof(stac)); memset(ans,0,sizeof(ans)); } void addedge(int u,int v,int w) { bian[yong].u=u; bian[yong].v=v; bian[yong].w=w; bian[yong].next=head[u]; head[u]=yong++; } int min(int a,int b) { return a>b?b:a; } void tarjan(int u) {//求缩点 int i; dfn[u]=low[u]=++index; stac[++top]=u; visit[u]=1; for(i=head[u];i!=-1;i=bian[i].next) { int v=bian[i].v; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(visit[v]) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { ++num; int t; do { t=stac[top--]; visit[t]=0; ans[t]=num; }while(t!=u); } } int main(){ int m,i,j,k,count,dis[N]; while(scanf("%d%d",&n,&m)!=EOF) { init(); while(m--) { scanf("%d%d%d",&i,&j,&k); addedge(i,j,k); } for(i=0;i<n;i++) if(!dfn[i]) tarjan(i); for(i=1;i<=num;i++) dis[i]=inf; for(i=0;i<yong;i++) if(ans[bian[i].u]!=ans[bian[i].v]) {//找到除源点外的进入每个点的最小权值,所有最小权值的和就是要求的 int v=ans[bian[i].v]; if(dis[v]>bian[i].w) dis[v]=bian[i].w; } count=0; for(i=1;i<=num;i++){ if(dis[i]<inf) count+=dis[i]; } printf("%d\n",count); } return 0; }
hdu 3072 强连通+缩点+最小树形图思想
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
java实现管线拓扑关系连通性分析
本文详细介绍了Java实现管线拓扑关系连通性的方法,并给出了详细的代码示例;同时详细介绍了深度优先搜索(DFS)和广度优先搜索(BFS)的联系与区别。
Graph 搜索 深度优先搜索 Java 广度优先搜索 -
HDU 3072 Intelligence System 强连通分量分解 + 最小树形图
通分量内的点花费为0,那么自然而然想到缩点,求缩点后的最小花费
acm scc hdu #include i++ -
HDU 4009 Transfer water 最小树形图
题目:http://acm.hdu.edu.cn/showproblem.
HDU i++ #include 最小树形图