• 逆向+两次bfs(UVA 1599)


    为什么都说简单好想咧。坦白从宽看了人家的代码,涨了好多姿势,,

    http://blog.csdn.net/u013382399/article/details/38227917

    被一个细节坑了。。

    2147483647是0x7fffffff啊啊啊,7个f!!!

      1 #include <iostream>
      2 #include <sstream>
      3 #include <cstdio>
      4 #include <cstring>
      5 #include <cmath>
      6 #include <string>
      7 #include <vector>
      8 #include <set>
      9 #include <cctype>
     10 #include <algorithm>
     11 #include <cmath>
     12 #include <deque>
     13 #include <queue>
     14 #include <map>
     15 #include <stack>
     16 #include <list>
     17 #include <iomanip>
     18 using namespace std;
     19 
     20 #define INF 0x7fffffff
     21 #define maxn 100000+10
     22 
     23 int n, m;
     24 vector<int> g[maxn];//用以存放互相连通的房间
     25 vector<int> col[maxn];//用以存放走廊颜色
     26 int step[maxn];//存放由n到i的最短步数
     27 int ans[maxn*2];
     28 int vis[maxn];
     29 void init()
     30 {
     31     for(int i = 0; i < maxn; i++)
     32     {
     33         g[i].clear();
     34         col[i].clear();
     35     }
     36     memset(step, -1, sizeof(step));
     37     memset(ans, 0, sizeof(ans));
     38     memset(vis, 0, sizeof(vis));
     39 }
     40 //==============获得到n的最少步数(逆向由n到1)===========
     41 void bfs1()
     42 {
     43     queue<int> q;
     44     q.push(n);
     45     step[n] = 0;//初始,由n到n的最短步数为0
     46     while(!q.empty())
     47     {
     48         int u = q.front(); q.pop();
     49         int sz = g[u].size();
     50         for(int i = 0; i < sz; i++)
     51         {
     52             int v = g[u][i];
     53 
     54             if(v == 1)
     55             {
     56                 step[v] = step[u]+1;
     57                 return ;
     58             }
     59 
     60             if(step[v] == -1)
     61             {
     62                 step[v] = step[u]+1;
     63                 q.push(v);
     64             }
     65         }
     66     }
     67     return ;
     68 }
     69 
     70 //==========获得最少步数时的最小走廊颜色===========
     71 void bfs2()
     72 {
     73     queue<int> q;
     74     q.push(1);
     75     while(!q.empty())
     76     {
     77         int u = q.front(); q.pop();
     78         ///
     79         if(!step[u])    return ;//到达n
     80         ///
     81         int mmin = INF;
     82         int sz = g[u].size();
     83         for(int i = 0; i < sz; i++)
     84         {
     85             int v = g[u][i];
     86             if(step[v] == step[u]-1)
     87             {
     88                 mmin = min(mmin, col[u][i]);//注意理解c[u][i]与g[u][i]间的联系--c[u][i]是u连接g[u][i]的走廊颜色
     89             }
     90         }
     91         //==========以上获得了从1出发最短路中每步的最小色
     92 
     93         int tmp_step = step[1] - step[u];//从1到u的步数,即出发第tmp_step步
     94         //ans[tmp_step] = (ans[tmp_step] == 0 ? mmin : min(mmin, ans[tmp_step]));
     95         if(ans[tmp_step] == 0)  ans[tmp_step] = mmin;
     96         else ans[tmp_step] = min(ans[tmp_step], mmin);
     97 
     98         for(int i = 0; i < sz; i++)
     99         {
    100             int v = g[u][i];
    101             ///该处判断条件很重要,把走过的路做标记
    102             if(!vis[v] && step[v] == step[u]-1 && mmin == col[u][i])
    103             {
    104                 vis[v] = 1;
    105                 q.push(v);
    106             }
    107         }
    108     }
    109     return ;
    110 }
    111 int main()
    112 {
    113     //===================input=====================
    114     while(~scanf("%d%d", &n, &m))
    115     {
    116         init();
    117         while(m--)
    118         {
    119             int a, b, c;
    120             scanf("%d%d%d", &a, &b, &c);
    121             if(a == b) continue;
    122             g[a].push_back(b);
    123             g[b].push_back(a);
    124             col[a].push_back(c);
    125             col[b].push_back(c);
    126         }
    127         //===============逆向bfs===============
    128         //============获得最短步数=============
    129         bfs1();
    130         //===============正向bfs===============
    131         //==========获得每步的走廊颜色=========
    132         bfs2();
    133 
    134         printf("%d
    ", step[1]);
    135         for(int i = 0; i < step[1]; i++)
    136         {
    137             if(i) printf(" ");
    138             printf("%d", ans[i]);
    139         }
    140         printf("
    ");
    141     }
    142     return 0;
    143 }
    View Code
  • 相关阅读:
    C51中的 xbyte的使用
    使用正则表达式替换日期格式
    C#制作windows窗体的图书管理系统
    《短码之美》读书笔记3
    VS2019创建第一个ASP.NET网站
    观影大数据分析(上)
    Git提交文件报错解决
    软件设计简单工厂模式
    记录一次MySQL启动异常的解决
    将本机web项目映射到公网访问
  • 原文地址:https://www.cnblogs.com/LLGemini/p/3904192.html
Copyright © 2020-2023  润新知