zoukankan      html  css  js  c++  java
  • 6-20 Ideal Path uva1599

    第一个bfs很快  但是我第一次做还用了结构体  这题完全不需要  反而导致了代码非常乱

    输入:

    一开始我是用m二维数组储存颜色  vector path来储存路径

    但是二维数组的下标是不够用的   所以颜色也要存在vector里

    直接放进去就行了  因为i已经对应好了  地几条路就是第几个颜色  值得学习!!

    主要是卡在了有多个路径的颜色是一样的情况

    先遍历一次找出最小的颜色  把颜色放进去 

    然后把该颜色的路径都加入队列即可

    开了一个INF9999999不停wa    下次直接开INT_MAX即可

    这题挺好的 值得学习!

    #include<bits/stdc++.h>
    using namespace std;
    #define MAX 102400
    int n;
    int d[MAX];
    int ans[MAX];
    int vis[MAX];
    vector<int>path[MAX],color[MAX];
    void bfs(void)
    {
      queue<int>q;
      q.push(n);
      d[n]=0;
      while(!q.empty())
      {
          int u=q.front();q.pop();
          if(u==1)return;
          for(int i=0;i< path[u].size();i++)
          {
    
             int v=path[u][i];
              if( d[v]==-1 )
              {
                  q.push(v);
                  d[v]=d[u]+1;
              }
          }
      }
    }
    void bfs2(void)
    {
        queue<int>q;
        q.push(1);
        while(!q.empty())
        {
            int u=q.front();q.pop();
            if(u==n)return;
            int minc=INT_MAX;
            for(int i=0;i< path[u].size() ;i++)
            {
                int v=path[u][i];
                if( d[u]==1+d[ v ]&&color[u][i]<minc )
                {
                   minc=color[u][i];
                }
            }
            if(!ans[ d[u] ] || minc<=ans[d[u]]  ) ans[ d[u] ]=minc;
            else continue;
            for(int i=0;i<path[u].size();i++)
            {
                int v=path[u ][i];
                if(!vis[v]&& d[u]==1+d[ v ]&color[u][i]==minc )
                {
                   q.push(v);
                   vis[v]=1;
                }
            }
        }
    }
    
    int main()
    {
      int q;
      while(scanf("%d%d",&n,&q)==2)
      {
          for(int i=0;i<MAX;i++){color[i].clear();path[i].clear();}
           memset(d,-1,sizeof(d));
           memset(vis,0,sizeof(vis));
           memset(ans,0,sizeof(ans));
          while(q--)
          {
              int x,y,z;
              scanf("%d%d%d",&x,&y,&z);
              path[x].push_back(y);
              path[y].push_back(x);
              color[x].push_back(z);
              color[y].push_back(z);
          }
          bfs();
          bfs2();
          printf("%d
    ", d[1]);
            for(int i = d[1]; i >= 1; --i){
                if(i==d[1]) printf("%d", ans[i]);
                else printf(" %d", ans[i]);
            }
            printf("
    ");
      }
      return 0;
    }
    View Code
  • 相关阅读:
    SparkSQL UDF使用方法与原理详解
    Hadoop 之日志管理—应用在 YARN 中运行时的日志
    圣诞节雪花效果,pc端
    转 redis使用场景 简介
    转 springboot 教程
    springboot freeMarker
    springboot web 服务器选择
    springboot 异步任务
    springboot 整合 rabbitmq
    软件开发生命周期过程中,必须考虑的安全问题
  • 原文地址:https://www.cnblogs.com/bxd123/p/10351762.html
Copyright © 2011-2022 走看看