SGU101 Domino

来源:互联网 发布:软件测试策略 编辑:程序博客网 时间:2024/05/16 19:36

题目大意:N(N<=100)张骨牌,每张骨牌的两端有数字0-6。问能否将其连成一条直线,使得前一张骨牌的右端与后一张骨牌的左端数字是相同的。允许通过旋转将骨牌的左右两端数字进行交换。


欧拉回路、欧拉路存在的判定:


1、欧拉路:
                无向图:连通。度数为奇数的顶点个数为0或2。
                有向图:基图连通。所有顶点的入度等于出度,或者有且仅有一个顶点入度-出度=1,有且仅有一个顶点出度-入度=1。
2、欧拉回路:
                无向图:连通。度数为奇数的顶点个数为0。

                有向图:基图连通。所有顶点的入度等于出度。


该题属于无向图求欧拉路。


#include<stdio.h>#include<vector>#include<cstring>using namespace std;struct Edge{    int u,v;    bool vis;};Edge edge[105];int deg[7];vector<pair<int,char> >ans;vector<int> a[7];void dfs(int u){    int i,j;    for(i=0;i<a[u].size();++i)    {        j=a[u][i];        if(!edge[j].vis)        {            edge[j].vis=1;            if(edge[j].u==u)            {                dfs(edge[j].v);                ans.push_back(make_pair(j+1,'+'));            }            else            {                dfs(edge[j].u);                ans.push_back(make_pair(j+1,'-'));            }        }    }}int main(){    int i,n;    scanf("%d",&n);    memset(deg,0,sizeof(deg));    for(i=0;i<n;++i)    {        scanf("%d%d",&edge[i].u,&edge[i].v);        edge[i].vis=0;        deg[edge[i].u]++,deg[edge[i].v]++;        a[edge[i].u].push_back(i);        a[edge[i].v].push_back(i);    }    int s=0,start;    for(i=0;i<7;++i) if(deg[i]&1) {start=i;++s;}  //求奇度顶点个数    if(s==0||s==2)    {        ans.clear();        for(i=0;i<7;++i)            if(deg[i]) start=i;        for(i=0;i<7;++i)            if(deg[i]&1) start=i;        dfs(start);        if(ans.size()<n) puts("No solution");        else        {            for(i=ans.size()-1;i>=0;--i) printf("%d %c\n",ans[i].first,ans[i].second);        }    }    else puts("No solution");    return 0;}


0 0
原创粉丝点击