第一个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