zoukankan      html  css  js  c++  java
  • cdoj 韩爷的情书 有向图 欧拉路径

    //欧拉回路

    解法:首先判断欧拉回路存在性:1、连通 2、没有出度入度相差大于1的点 3、如果有出度入度相差等于1的点那么必须有两个,一个出度大于入度作为起点,一个入度大于出度作为终点。

    在确定了起点后,用dfs法找欧拉回路。

    关于dfs找欧拉回路:其实就是欧拉回路存在的充要性定理的证明,先走到底(最后走到的一定是终点,如果重点起点固定的话),然后再递归回来找圈,因为图连通,后来找到的圈也可以加到里面。

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<cmath>
      4 #include<algorithm>
      5 #include<cstring>
      6 #include<cstdlib>
      7 #include<queue>
      8 #include<vector>
      9 #include<map>
     10 #include<stack>
     11 #include<string>
     12 
     13 using namespace std;
     14 
     15 int e[5000][5000];
     16 int n;
     17 int din[5000],dout[5000];
     18 char s[5];
     19 int maxLen;
     20 int start;
     21 int num=0;
     22 char ans[200007];
     23 bool flag=false;
     24 
     25 int getid(char c){
     26     if (c<='z' && c>='a') return c-'a';
     27     if (c<='Z' && c>='A') return c-'A'+26;
     28     return c-'0'+52;
     29 }
     30 
     31 int getidfrom(char* s){
     32     return getid(s[0])*62+getid(s[1]);
     33 }
     34 
     35 int getidto(char* s){
     36     return getid(s[1])*62+getid(s[2]);
     37 }
     38 
     39 char getch(int x){
     40     if (x<26 && x>=0) return 'a'+x;
     41     if (x<52 && x>=26) return 'A'+x-26;
     42     return x+'0'-52;
     43 }
     44 
     45 void dfs(int now){
     46     for (int i=0;i<=maxLen;i++){
     47             if (e[now][i]>0){
     48                     e[now][i]--;
     49                     dfs(i);
     50             }
     51     }
     52     if (!flag){
     53             flag=true;
     54             ans[num++]=getch(now%62);
     55     }
     56     ans[num++]=getch(now/62);
     57 }
     58 
     59 int main(){
     60     scanf("%d",&n);
     61     memset(e,0,sizeof(e));
     62     memset(din,0,sizeof(din));
     63     memset(dout,0,sizeof(dout));
     64     maxLen=getid('9')*62+getid('9');
     65     for (int i=0;i<n;i++){
     66             scanf("%s",s);
     67             int from=getidfrom(s);
     68             int to=getidto(s);
     69             dout[from]++;
     70             din[to]++;
     71             e[from][to]++;
     72     }
     73     int cnt1=0;
     74     int cnt2=0;
     75     start=-1;
     76     for (int i=0;i<=maxLen;i++){
     77             if (start==-1 && (din[i]!=0 || dout[i]!=0)) start=i;
     78             if (abs(din[i]-dout[i])>1){
     79                     printf("NO
    ");
     80                     return 0;
     81             }
     82             if (din[i]>dout[i]) cnt1++;
     83             if (din[i]<dout[i]){
     84                     cnt2++;
     85                     start=i;
     86             }
     87     }
     88     if (!((cnt1==0 && cnt2==0)||(cnt1==1 && cnt2==1))){
     89             printf("NO
    ");
     90             return 0;
     91     }
     92     dfs(start);
     93     if (num!=n+2){
     94             printf("NO
    ");
     95             return 0;
     96     }
     97     printf("YES
    ");
     98     for (int i=num-1;i>=0;i--){
     99             printf("%c",ans[i]);
    100     }
    101     printf("
    ");
    102     return 0;
    103 }
    104 /*
    105 4
    106 baa
    107 caa
    108 aax
    109 aay
    110 
    111 10
    112 Aa3
    113 a3X
    114 3XX
    115 XXy
    116 Xy1
    117 y12
    118 123
    119 234
    120 345
    121 456
    122 
    123 5
    124 123
    125 234
    126 345
    127 456
    128 567
    129 
    130 3
    131 123
    132 231
    133 312
    134 */
  • 相关阅读:
    devstack安装openstack
    Stacks of Flapjacks
    二、Reids基础命令--字符串
    数据库筛选用户,然后去掉一部分(列表求差),再随机返回一个用户。sqlalchemy + python集合(set) + random
    利用Powershell获取公司内部机器的资源信息,作为企业兴许资产管理的基本途径!
    《编程导论(Java)&#183;3.2.4 循环语句》
    Android自己主动检測版本号及自己主动升级
    基于bootstrap的富文本框——wangEditor【欢迎增加开发】
    找球号(三)
    #308 (div.2) B. Vanya and Books
  • 原文地址:https://www.cnblogs.com/baby-mouse/p/4529457.html
Copyright © 2011-2022 走看看