题目地址:http://poj.org/problem?id=2387
考虑双向边,还有重边,裸的算法
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int INF=(1<<30); const int maxn=1000+5; struct Edge{ int to; int weight; Edge(int t,int w):to(t),weight(w){} }; vector<vector<Edge> > G(maxn); bool inq[maxn]; //判断是否在队列里 int dist[maxn]; int p[maxn]; //记录路径 int cnt[maxn]; bool Spfa(int s,int n) { memset(inq,false,sizeof(inq)); memset(cnt,0,sizeof(cnt)); memset(dist,0x7f,sizeof(dist)); queue<int> Q; dist[s]=0; inq[s]=true; Q.push(s); while(!Q.empty()) { int u=Q.front(); Q.pop(); inq[u]=false; for(int i=0;i<G[u].size();i++) { int v=G[u][i].to, w=G[u][i].weight; if(dist[v]>dist[u]+w) { dist[v]=dist[u]+w; p[v]=u; // if(++cnt[v]>=n) return false; //要注释掉,因为存在重边,一个点会遍历多次 if(!inq[v]) Q.push(v),inq[v]=true; } } } return true; } int main() { int N,M,u,v,w; cin>>M>>N; while(M--) { cin>>u>>v>>w; G[u].push_back(Edge(v,w)); G[v].push_back(Edge(u,w)); } Spfa(1,N); cout<<dist[N]<<endl; return 0; }