#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<map> #define inf 1000000000 #define pa pair<int,int> using namespace std; int n,m,cnt,dis[1005],head[1005]; bool vis[1005]; int next[50005],list[50005],key[50005]; inline int read() { int a=0,f=1; char c=getchar(); while (c<‘0‘||c>‘9‘) {if (c==‘-‘) f=-1; c=getchar();} while (c>=‘0‘&&c<=‘9‘) {a=a*10+c-‘0‘; c=getchar();} return a*f; } inline void insert(int u,int v,int w) { next[++cnt]=head[u]; head[u]=cnt; list[cnt]=v; key[cnt]=w; } inline void dijkstra() { priority_queue<pa,vector<pa>,greater<pa> > q; for (int i=1;i<=n;i++) dis[i]=inf,vis[i]=0; dis[1]=0; q.push(make_pair(0,1)); while (!q.empty()) { int now=q.top().second; q.pop(); if (vis[now]) continue; vis[now]=1; for (int i=head[now];i;i=next[i]) { if (dis[list[i]]>dis[now]+key[i]) { dis[list[i]]=dis[now]+key[i]; q.push(make_pair(dis[list[i]],list[i])); } } } } int main() { m=read(); n=read(); for (int i=1;i<=m;i++) { int u=read(),v=read(); insert(u,v,1); } dijkstra(); if (dis[n]==inf) puts("-1"); else printf("%d",dis[n]+1); return 0; }
[Usaco2005][BZOJ1674] Part Acquisition|dijkstra|priority_queue
原文:http://www.cnblogs.com/ws-fqk/p/4766508.html