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\n", d[1]);
        for(int i = d[1]; i >= 1; --i){
            if(i==d[1]) printf("%d", ans[i]);
            else printf(" %d", ans[i]);
        }
        printf("\n");
  }
  return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10351762.html