社交网络 (并查集的应用)

很简单的并查集基础应用,相当于连通图的问题,将可连接的节点归并到同一个节点下即可.直接上代码.

描述
随着社交平台的兴起,人们之间的沟通变得越来越密切。通过Facebook的分享功能,只要你是对方的好友,你就可以转发对方的状态,并且你的名字将出现在“转发链”上。经过若干次转发以后,很可能A分享了一条好友C的状态,而C的这条状态实际上是分享B的,但A与B可能并不是好友,即A通过C间接分享了B的状态。
给定你N个人之间的好友关系,好友关系一定是双向的。只要两个人是好友,他们就可以互相转发对方的状态,无论这条状态是他自己的,还是他转发了其他人的。现在请你统计,对于每两个人,他们是否有可能间接转发对方的状态。

输入

第一行1个整数N(1<=N<=300)。
接下来N行每行N个整数,表示一个N*N的01矩阵,若矩阵的第i行第j列是1,表示这两个人是好友,0则表示不是好友。
保证矩阵的主对角线上都是1,并且矩阵关于主对角线对称。

输出

一个N*N的01矩阵,若矩阵的第i行第j列是1,表示这两个人可能间接转发对方的状态,0则表示不可能。

#include 
#include 
using namespace std;

char str[310][310];
int n, b[310][310], father[310];

int find(int x)//返回祖先节点
{
    if(x == father[x])
        return father[x];
    father[x] = find(father[x]);
    return father[x];
}

void Union(int x,int y)
{
    int fx = find(x);
    int fy = find(y);
    if(fx != fy)
    {
        father[fx] = fy;
    }
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        father[i] = i;
    for(int i=1;i<=n;i++)
    {
        cin>>str[i];
        for(int j=1;j<=n;j++)
        {
            if(str[i][j-1] == '1')
                Union(i,j);//归并
        }
    }

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            if(find(i) == find(j))
                b[i][j] = 1;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            printf("%d",b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(POJ-OJ,算法,社交网络,c语言,应用)