题意;
给n和物品和m个关系 ,其中(a,b)表示用a物品可以换b物品,问用物品1换物品n最少需要几步并输出交换序列。
思路:
裸的最短路,spfa模板题。
代码:
//poj 2457
//sepNINE
#include <iostream>
#include <queue>
using namespace std;
const int maxN=1024;
const int maxM=50012;
int head[maxN];
int dis[maxN];
int inq[maxN];
int outQueue[maxN];
int path[maxN];
int ansPath[maxN];
int m,n,e;struct Edge
{int v,w,next;
}edge[maxM];bool spfa(int start)
{queue<int> Q;inq[start]=1;dis[start]=0;Q.push(start);while(!Q.empty()){int top=Q.front();Q.pop();++outQueue[top]; if(outQueue[top]>n) return -1;for(int k=head[top]; k!=-1; k=edge[k].next){int u=top,v=edge[k].v,w=edge[k].w;if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;path[v]=u;}if(!inq[v]){inq[v]=1;Q.push(v);}}}return true;
}int main()
{while(~scanf("%d%d", &m, &n)){e=0;memset(head, -1, sizeof(head));memset(inq, 0, sizeof(inq));memset(outQueue, 0, sizeof(outQueue));for(int i=1; i<=n; ++i) dis[i]=INT_MAX;while(m--){int a,b;scanf("%d%d", &a, &b);edge[e].v=b;edge[e].w=1;edge[e].next=head[a];head[a]=e++;}if(spfa(1)&&dis[n]!=INT_MAX){printf("%d\n", dis[n]+1);int cnt=0;for(int i=n;; i=path[i]){ansPath[cnt++]=i;if(i==1)break;}for(int i=cnt-1; i>=0;--i)printf("%d\n", ansPath[i]);}elseprintf("-1\n"); }return 0;
}