强连通缩点 hdu3072

题意:实现某确定一点向其他所有的点直接或者间接地传递消息。如果某几个点之间消息可以互达,则不收取费用,求所有点接受到消息所花费的最小值。

连通分量内不收取费用,所以枚举找到联通分量之间最小值。

#include
#include
#include
#include
using namespace std;
#define ll long long
#define me(a,b) memset(a,b,sizeof(a))
struct node
{
    int u,val,next;
} e[100005];
int dfn[50005],low[50005],head[50005],scnt[50005],ans[50005];
int tot,cnt,top;
void add(int u,int v,int val)
{
    e[top].u=v;
    e[top].val=val;
    e[top].next=head[u];
    head[u]=top++;
}
stackq;
int n,m;
int trijan(int x)
{
    dfn[x]=low[x]=++tot;
    q.push(x);
    for(int i=head[x];i!=-1;i=e[i].next)
    {
        int u=e[i].u;
        if(!dfn[u])
        {
            trijan(u);
            low[x]=min(low[u],low[x]);
        }
        else if(!scnt[u])low[x]=min(low[x],dfn[u]);
    }
    if(low[x]==dfn[x])
    {
        int v=-1;
        cnt++;
        while(v!=x)
        {
            v=q.top();
            q.pop();
            scnt[v]=cnt;
        }
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        tot=top=cnt=0; me(head,-1);
       for(int i=0;i

你可能感兴趣的:(图论)