UVA 10054 The Necklace(euler)

题意:有一堆散落的项链的的珠子,珠子有可能重复的出现,问我们能否连接成一条项链。每个珠子上头和尾都用颜色(用0~50表示)。思路:这是一个无向图的欧拉回路。在输出欧拉回路前要先判断该图是否连通和是否为欧拉图;因为珠子可以重复出现,不适用表边,用矩阵保存。

//0 KB    285 ms
#include
#include
const int VM = 55;

int vis[VM],mat[VM][VM];

void DFS(int u)
{
    vis[u] = 1;
    for (int v = 0; v < VM; v ++)
    {
        if (mat[u][v]&&!vis[v])
            DFS(v);
    }
}
void euler(int u) //输出欧拉回路
{
    for (int v = 0; v < VM; v ++)
    {
        if (mat[u][v])
        {
            -- mat[u][v];
            -- mat[v][u];
            euler(v);
            printf ("%d %d\n",v,u);//反过来输出
        }
    }
    return ;
}
int main ()
{
    #ifdef LOCAL
        freopen("in.txt","r",stdin);
    #endif
    int T,n,cnt = 0,src;
    int u,v,i;
    int deg[VM];  //每个点的度
    scanf ("%d",&T);
    while (T --)
    {
        memset (deg,0,sizeof(deg));
        memset (mat,0,sizeof(mat));
        scanf ("%d",&n);
        for (i = 0; i < n; i ++)
        {
            scanf ("%d %d",&u,&v);
            mat[u][v] ++;                //有重边
            mat[v][u] ++;
            deg[u] ++;
            deg[v] ++;
        }
        src = u;
        printf ("Case #%d\n",++cnt);
        bool f1 = true,f2 = true;
        for (i = 0; i < VM; i ++) //是否为欧拉图
            if (deg[i]&1)
            {
                f1 = false;
                break;
            }
        if (f1)
        {
            memset (vis,0,sizeof(vis));
            DFS(src);
            for (i = 0; i < VM; i ++) //是否连通
                if (deg[i]&&!vis[i])
                {
                    f2 = false;
                    break;
                }
            if (f2)
                euler(src);
            else printf ("some beads may be lost\n");
        }
        else printf ("some beads may be lost\n");
        printf ("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值