PAT 1030 Travel Plan SPFA
2014-08-25 11:38
351 查看
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<stack> #include<queue> using namespace std; struct node { int to,next,dd,w; }e[100005]; int dis[1005],cost[1005],head[1005],in[1005],pre[1005]; int cnt; stack<int>st; void addedge(int a,int b,int dd,int w) { e[cnt].to = b; e[cnt].dd = dd; e[cnt].w = w; e[cnt].next = head[a]; head[a] = cnt++; } void spfa(int s,int d) { memset(dis,0x7f,sizeof(dis)); memset(in,0,sizeof(in)); dis[s] = 0; queue<int>q; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); in[u] = 0; for(int i = head[u];i!=-1;i = e[i].next) { int v = e[i].to; int dd = e[i].dd; int w = e[i].w; if(dis[v]>dis[u]+dd||(dis[v] == dis[u]+dd&&cost[u]+w<cost[v])) { dis[v] = dis[u]+dd; cost[v] = cost[u]+w; pre[v] = u; if(!in[v]) { in[v] = 1; q.push(v); } } } } } int main() { int n,m,s,d,i,j; cnt = 0; cin>>n>>m>>s>>d; memset(head,-1,sizeof(head)); for(i = 1;i<=m;i++) { int a,b,c,e; cin>>a>>b>>c>>e; addedge(a,b,c,e); addedge(b,a,c,e); } spfa(s,d); int td = d; while(td!=s) { st.push(td); td = pre; } st.push(s); while(!st.empty()) { cout<<st.top()<<" "; st.pop(); } cout<<dis[d]<<" "<<cost[d]; return 0; } 相关文章推荐
- PAT1030 Travel Plan (30)---DFS
- PAT (Advanced Level) Practise 1030 Travel Plan (30)
- PAT(甲级)1030 Travel Plan(带两个权值的最短路)
- PAT-1030 Travel Plan (30)
- 【PAT 1030】Travel Plan 最短路径Dijkstra
- PAT 1030 Travel Plan(单源最短路径+优化Dijkstra)
- PAT 1030 Travel Plan (30)
- PAT程序设计考题——甲级1030(Travel Plan) C++实现
- Pat(Advanced Level)Practice--1030(Travel Plan)
- PAT (Advanced Level) Practise 1030 Travel Plan (30)
- 浙大PAT 1030题 1030. Travel Plan
- 1030 Travel Plan (30)
- PAT 1030 Travel Plan dijkstra算法+双最短条件+保存最短路
- PAT乙级(Basic Level)真题-1030 组个最小数 (20)
- PAT Advanced Level 1030
- Python实现PAT1030 完美数列
- PAT甲级1030. Travel Plan(30)
- pat1030完美数列bug总结,
- PAT 1030. Travel Plan (30)
- PAT乙级1030完美数列