Ideal Path 不熟悉父节点方式
自己先敲了一遍
1.发现需要vis数组来进行mark
2.无论是push过程还是pop过程发现目标节点都可以开始打印,但是push过程如果有多个parent节点会有错误.
1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <vector> 5 6 using namespace std; 7 8 const int maxn=1000; 9 10 int G[maxn][maxn]; 11 int p[maxn]; 12 int vis[maxn]; 13 int n; 14 int m; 15 queue<int> q; 16 vector<int> v; 17 18 void init() 19 { 20 for(int i=0;i<m;i++) 21 { 22 int l1,l2,rgb; 23 cin>>l1>>l2>>rgb; 24 25 G[l1][l2]=G[l2][l1]=rgb; 26 } 27 } 28 29 void print_ans(int i) 30 { 31 v.clear(); 32 33 while(i!=1) 34 { 35 v.push_back(i); 36 37 i=p[i]; 38 } 39 40 printf("1 "); 41 for(int i=v.size()-1;i>=0;i--) 42 if(i==v.size()-1) printf("%d",v[i]); 43 else printf(" %d",v[i]); 44 45 printf(" "); 46 } 47 48 void bfs(int i) 49 { 50 q.push(1); 51 vis[1]=1; 52 53 while(!q.empty()) 54 { 55 int node=q.front(); 56 q.pop(); 57 58 for(int j=1;j<=n;j++) 59 { 60 if(G[node][j]>0) 61 if(!vis[j]) 62 { 63 q.push(j); 64 p[j]=node; 65 vis[j]=1; 66 67 //找到最先连接目标点的路径即为最短路径??? 68 if(j==i) 69 { 70 print_ans(i); 71 return; 72 } 73 } 74 } 75 } 76 } 77 78 79 80 int main() 81 { 82 cin>>n; 83 cin>>m; 84 85 int i; 86 cin>>i; 87 88 init(); 89 90 bfs(i); 91 92 return 0; 93 }
不记录父节点的bfs
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <map> using namespace std; const int maxn=10000; const int inf=1000000; int G[maxn][maxn]; int d[maxn]; int vis[maxn]; queue<int> q; map<int,int> ma; int m,n; void init() { for(int i=0;i<m;i++) { int l1,l2; cin>>l1>>l2; //cout<<l1<<" "<<l2<<endl; G[l1][l2]=G[l2][l1]=1; } } void bfs(int dst) { memset(d,inf,sizeof(d)); q.push(dst); vis[dst]=1; d[dst]=0; while(!q.empty()) { int node=q.front(); q.pop(); for(int i=1;i<=n;i++) if(G[node][i]>0) if(!vis[i]) { d[i]=d[node]+1; q.push(i); vis[i]=1; } } } void print_bfs(int dst) { memset(vis,0,sizeof(vis)); q.push(1); vis[1]=1; ma[d[1]]=1; printf("1"); while(!q.empty()) { int node=q.front(); q.pop(); for(int i=1;i<=n;i++) if(G[node][i]>0) if(!vis[i]) if(d[i]==d[node]-1) if(ma.count(d[i])==0) { printf(" %d",i); vis[i]=1; q.push(i); ma[d[i]]=1; if(i==dst) return; } } } int main() { cin>>n; cin>>m; //cout<<"m:"<<m<<" "<<"n:"<<n<<endl; init(); int j; cin>>j; bfs(j); //printf("d1:%d d2:%d d3:%d d4:%d d5:%d ",d[1],d[2],d[3],d[4],d[5]); //printf("G[5][2]=%d G[5][1]=%d G[4][1]=%d G[2][1]=%d G[2][3]=%d G[1][3]=%d ",G[5][2],G[5][1],G[4][1],G[2][1],G[2][3],G[1][3]); print_bfs(j); printf(" "); return 0; }