码迷,mamicode.com
首页 > 其他好文 > 详细

sgu101 欧拉路

时间:2014-09-10 22:26:51      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   for   div   sp   log   

题意:给你n张牌,每个牌有两面,要求找出一种摆放顺序,使得相邻的牌的面相同。初始给出的牌的方向为正

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
int father[7];
int len;
int head[7];
int bx;
int degree[7];
int vis[7];
int getfather(int x)
{
    if(father[x]!=x) father[x]=getfather(father[x]);
    return father[x];
}

struct edge
{
    int val;int to;int next;int vis;int oppo;int t;
}e[1111];

void link(int a,int b)
{
    int fa=getfather(a); int fb= getfather(b);
    father[fa]=fb;
}
void add(int from,int to,int val)
{
    e[len].t=1;
    e[len].to =to ;e[len].val = val;e[len].vis=0;
    e[len].oppo= len+1;
    e[len].next= head[from];

    head[from]= len++;
    e[len].to= from;e[len].val=val;
    e[len].t= 0;
    e[len].vis=0;
    e[len].oppo= len-1;
    e[len].next= head[to];
    head[to]=len++;
}

int judge()
{
    bx= 0 ;
    int ans=0;int ans1=0;
    for(int i=0;i<=6;i++)
    if(vis[i])if(father[i]==i) ans++;
    if(ans!=1) return 0;
    for(int i=0;i<=6;i++)
        if(degree[i]&1) ans1++,bx= i;
    if(bx==0) for(int i=0;i<=6;i++)
        if(vis[i]) bx= i;
    if(ans1==2||ans1==0) return 1;
    return 0;
}

struct Node
{
    int t;int x;
};
stack <Node> q;
void dfs(int x)
{
    for(int i= head[x];i!=-1;i=e[i].next){
        if(e[i].vis) continue;
        int cc=e[i].to;
        e[i].vis= 1;e[e[i].oppo].vis=1;
        dfs(cc);
        Node gg ;
        if(e[i].t==1) gg.t=1;
        else gg.t=0;
        gg.x= e[i].val;
        q.push(gg);
    }
}
int main()
{
    int n,a,b;
    scanf("%d",&n);
        memset(head,-1,sizeof(head));
        len=0;
        memset(vis,0,sizeof(vis));
        memset(degree,0,sizeof(degree));
        for(int i=0;i<=6;i++)
            father[i]= i;
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a,&b);
            vis[a]=1;vis[b]=1;
            add(a,b,i);
            degree[a]++; degree[b]++;
            link(a,b);
        }
        if(judge()==0) printf("No solution\n");
        else{
            dfs(bx);
            while(!q.empty()){
                Node t= q.top(); q.pop();
                if(t.t==1) printf("%d +\n",t.x);
                else printf("%d -\n",t.x);
            }
            printf("\n");
        }
    return 0;
}

 

sgu101 欧拉路

标签:style   blog   color   io   os   for   div   sp   log   

原文地址:http://www.cnblogs.com/yigexigua/p/3965153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!