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
  • 相关阅读:
    HDU 1874 畅通工程续(dijkstra)
    HDU 2112 HDU Today (map函数,dijkstra最短路径)
    HDU 2680 Choose the best route(dijkstra)
    HDU 2066 一个人的旅行(最短路径,dijkstra)
    关于测评机,编译器,我有些话想说
    测评机的优化问题 时间控制
    CF Round410 D. Mike and distribution
    数字三角形2 (取模)
    CF Round410 C. Mike and gcd problem
    CF Round 423 D. High Load 星图(最优最简构建)
  • 原文地址:https://www.cnblogs.com/bxd123/p/10351762.html
Copyright © 2011-2022 走看看