6-20 Ideal Path uva1599

时间:2024-04-18 03:57:41

第一个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]=;
while(!q.empty())
{
int u=q.front();q.pop();
if(u==)return;
for(int i=;i< path[u].size();i++)
{ int v=path[u][i];
if( d[v]==- )
{
q.push(v);
d[v]=d[u]+;
}
}
}
}
void bfs2(void)
{
queue<int>q;
q.push();
while(!q.empty())
{
int u=q.front();q.pop();
if(u==n)return;
int minc=INT_MAX;
for(int i=;i< path[u].size() ;i++)
{
int v=path[u][i];
if( d[u]==+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=;i<path[u].size();i++)
{
int v=path[u ][i];
if(!vis[v]&& d[u]==+d[ v ]&color[u][i]==minc )
{
q.push(v);
vis[v]=;
}
}
}
} int main()
{
int q;
while(scanf("%d%d",&n,&q)==)
{
for(int i=;i<MAX;i++){color[i].clear();path[i].clear();}
memset(d,-,sizeof(d));
memset(vis,,sizeof(vis));
memset(ans,,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[]);
for(int i = d[]; i >= ; --i){
if(i==d[]) printf("%d", ans[i]);
else printf(" %d", ans[i]);
}
printf("\n");
}
return ;
}