• Riding the Fences USACO 3.3 欧拉路径(dfs+floodfill)


    额,我是直接dfs的思路,但是到case 5过不去了,感觉是太慢了。然后网上看题解,题目原型就是欧拉路径,

    欧拉路径存在的条件是 要么点的度都是偶数,要么只有两个点的度是奇数。如果是两个点的度是奇数,起点和终点一定是这两个点,

    然后我就加了一个判断,如果是有奇数度的点,取较小的点作为起点dfs。

    dfs写的很丑,没组织好,还根据初始点判断,其实组织好没有这么麻烦...

    但是到7还是过不去,继续看题解,发现有个大牛dfs同时加了个floodfill

    其实我一直以为floodfill就是dfs和bfs...

    然后我仿照加了个勉强过了

      1 /*
      2 
      3 ID: hubiao cave
      4 
      5 PROG: fence
      6 
      7 LANG: C++
      8 
      9 */
     10 
     11 
     12 
     13 
     14 #include<iostream>
     15 
     16 #include<fstream>
     17 #include<cstring>
     18 #include<vector>
     19 #include<deque>
     20 #include<algorithm>
     21 
     22 using namespace std;
     23 
     24 
     25 
     26 vector<int> g_vertex_maps[501];
     27 deque<int>  g_vertex_sequence;
     28 int g_visit[501][501];
     29 int g_fence_number;
     30 int g_max_vertex,g_min_vertex=1;
     31 int g_count;
     32 int node_counter[501];
     33 bool g_isover=false;
     34 int special_start_vertex=8888;
     35 
     36 void dfs(int);
     37 bool floodfill(long node);
     38  ofstream fout("fence.out");
     39 int main()
     40 
     41 {
     42 
     43     ifstream fin("fence.in");
     44 
     45     //ofstream fout("fence.out");
     46     
     47     fin>>g_fence_number;
     48     
     49     int a,b;
     50     for(int i=0;i<g_fence_number;i++)
     51     {
     52         fin>>a>>b;
     53         if(i==0)
     54             g_min_vertex=min(a,b);
     55 
     56         g_vertex_maps[a].push_back(b);
     57         g_vertex_maps[b].push_back(a);
     58 
     59         node_counter[a]++;
     60         node_counter[b]++;
     61         g_visit[a][b]++;
     62         g_visit[b][a]++;
     63 
     64         g_max_vertex=g_max_vertex>max(a,b)?g_max_vertex:max(a,b);
     65         g_min_vertex=g_min_vertex<min(a,b)?g_min_vertex:min(a,b);
     66 
     67     }
     68 
     69     for(int i=g_min_vertex;i<=g_max_vertex;i++)
     70     {
     71         if(!g_vertex_maps[i].empty())
     72             sort(g_vertex_maps[i].begin(),g_vertex_maps[i].end());
     73 
     74         if(g_vertex_maps[i].size()%2==1)//欧拉路径 找度为奇数的点为起点加速
     75             special_start_vertex=min(special_start_vertex,i);
     76             
     77     }
     78 
     79 
     80     if(special_start_vertex==8888)
     81         dfs(0);
     82     else
     83         dfs(special_start_vertex);
     84     
     85 
     86     return 0;
     87 
     88 
     89 }
     90 
     91 void dfs(int start_vertex)
     92 {
     93 
     94     if(g_count==g_fence_number)
     95     {
     96         if(special_start_vertex!=8888)
     97             g_vertex_sequence.push_front(special_start_vertex);
     98         for(int i=0;i<g_vertex_sequence.size();i++)
     99             fout<<g_vertex_sequence[i]<<endl;
    100         g_isover=true;
    101         exit(0);
    102         //return;
    103     }
    104     
    105     if(start_vertex!=0&&!floodfill(start_vertex))
    106     {
    107         return;
    108     }
    109 
    110     if(start_vertex==0)
    111     {
    112         for(int i=g_min_vertex;i<=g_max_vertex;i++)
    113         {
    114 
    115             for(int j=0;j<g_vertex_maps[i].size();j++)
    116             {
    117                 g_count++;
    118                 g_visit[i][g_vertex_maps[i][j]]--;
    119                 g_visit[g_vertex_maps[i][j]][i]--;
    120                 g_vertex_sequence.push_back(i);
    121                 g_vertex_sequence.push_back(g_vertex_maps[i][j]);
    122                 node_counter[i]--;
    123                 node_counter[g_vertex_maps[i][j]]--;
    124 
    125                 dfs(g_vertex_maps[i][j]);
    126 
    127                 if(g_isover)
    128                     return;
    129 
    130                 node_counter[i]++;
    131                 node_counter[g_vertex_maps[i][j]]++;
    132 
    133                 g_vertex_sequence.pop_back();
    134                 g_vertex_sequence.pop_back();
    135                 g_visit[i][g_vertex_maps[i][j]]++;
    136                 g_visit[g_vertex_maps[i][j]][i]++;
    137 
    138                 g_count--;
    139             }
    140         }
    141     }
    142     else
    143     {
    144         for(int i=0;i<g_vertex_maps[start_vertex].size();i++)
    145         {
    146             int end_vertex=g_vertex_maps[start_vertex][i];
    147             if(g_visit[start_vertex][end_vertex]>0)
    148             {
    149                 g_count++;
    150                 g_visit[start_vertex][end_vertex]--;
    151                 g_visit[end_vertex][start_vertex]--;
    152                 g_vertex_sequence.push_back(end_vertex);
    153 
    154                 node_counter[start_vertex]--;
    155                 node_counter[end_vertex]--;
    156 
    157                 dfs(end_vertex);
    158                 if(g_isover)
    159                     return;
    160 
    161                 node_counter[start_vertex]++;
    162                 node_counter[end_vertex]++;
    163 
    164                 g_count--;
    165                 g_visit[start_vertex][end_vertex]++;
    166                 g_visit[end_vertex][start_vertex]++;
    167                 g_vertex_sequence.pop_back();
    168             }
    169 
    170         }
    171     }
    172 }
    173 
    174 bool floodfill(long node)
    175 {
    176     int *stack=new int[501],top=-1;
    177     bool vis[501];
    178     //for(int i=0;i<=500;i++)
    179         memset(vis,0,sizeof(vis));
    180 
    181     stack[++top]=node;
    182     vis[node]=true;
    183     while(top>-1)
    184     {
    185         int m=stack[top--];
    186         for(int i=g_min_vertex;i<=g_max_vertex;i++)
    187         {
    188             if(g_visit[m][i]&&!vis[i])
    189             {
    190             stack[++top]=i;
    191             vis[i]=true;
    192             }
    193         }
    194     }
    195 
    196     for(int i=g_min_vertex;i<=g_max_vertex;i++)
    197     {
    198         if(!vis[i]&&node_counter[i])
    199         {
    200             delete stack;
    201             return false;
    202         }
    203     }
    204     delete stack;
    205     return true;
    206 
    207 }
  • 相关阅读:
    如何面试程序员?
    类似猪八戒网的网站
    存储过程
    一个不错的网站(博客制作参考)
    用触发器来实现级联更新级联删除
    用触发器进行级联删除
    数据库触发器详解
    浅谈数据库中的存储过程
    JDBC连接数据库
    Java递归函数
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3363120.html
Copyright © 2020-2023  润新知