PAT 1018 Public Bike Management DFS+SPFA
2014-08-25 23:34
417 查看
被题目的意思搞跪了....从PBMC出发,到终点,路上把每个站点都调整到最优。路上如果后面有站点可以获得到多余的车,也不能把车带回来给前面的站点
#include<algorithm> #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<vector> #include<set> #include<map> #include<queue> #define ll long long using namespace std; queue<int>q; vector<int>pre[505],path[505],ans,tmp; int g[505][505],in[505],dis[505],a[505]; int ed,c,n,m,mn_have,mn_need; void spfa() { memset(dis,0x7f,sizeof(dis)); memset(in,0,sizeof(in)); q.push(0); in[0] = 1; dis[0] = 0; while(!q.empty()) { int u = q.front(); q.pop(); in[u] = 0; for(int i = 0;i<=n;i++) { if(g[u][i] == -1)continue; if(dis[i]>dis[u]+g[u][i]) { dis[i] = dis[u]+g[u][i]; pre[i].clear(); pre[i].push_back(u); if(!in[u]) { q.push(i); in[i] = 1; } } else if(dis[i] == dis[u]+g[u][i])pre[i].push_back(u); } } } void dfs(int u,int have,int need) { tmp.push_back(u); if(u == ed) { if(need<mn_need||(need == mn_need&&have<mn_have)) { ans = tmp; mn_need = need; mn_have = have; } } for(int i = 0;i<path[u].size();i++) { int v = path[u][i]; int t_have = have+a[v]-c/2,t_need = need; if(t_have<0) { t_need = need-t_have; t_have = 0; } dfs(v,t_have,t_need); } tmp.pop_back(); } int main() { int i,j,x,y,z; while(scanf("%d%d%d%d",&c,&n,&ed,&m)!=EOF) { memset(g,-1,sizeof(g)); for(i = 1;i<=n;i++)scanf("%d",&a[i]); for(i = 1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); g[x][y] = g[y][x] = z; } spfa(); for(i = 0;i<=n;i++) for(j = 0;j<pre[i].size();j++) path[pre[i][j]].push_back(i); mn_have = mn_need = 1e9; dfs(0,0,0); printf("%d ",mn_need); for(i = 0;i<ans.size();i++) { printf("%d",ans[i]); if(i!=ans.size()-1)printf("->"); } printf(" %d\n",mn_have); } return 0; }
相关文章推荐
- PAT (Advanced Level)1018. Public Bike Management (30) 迪杰斯特拉算法 DFS 递归(难)
- 1018. Public Bike Management (30) (SPFA + DFS)
- 1018. Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS)
- PAT-1018 Public Bike Management(dijkstra + dfs)
- PAT 1018 Public Bike Management(Dijkstra 最短路)
- PAT (Advanced Level) Practise 1018 Public Bike Management (30)
- PAT 1018 Public Bike Management(Dijkstra 最短路)
- PAT 甲级 1018 Public Bike Management
- 1018. Public Bike Management (30)---dijk+dfs
- PAT-Java-1018-Public Bike Management (30)
- PAT-1018 Public Bike Management (30)
- 1018. Public Bike Management (30)——PAT (Advanced Level) Practise
- PAT Public Bike Management (dfs)
- PAT(甲级)1018. Public Bike Management (30)
- PAT 1018 Public Bike Management
- PAT (Advanced Level) Practise 1018 Public Bike Management (30)
- 准备PAT之Public Bike Management——DFS/DFS+Dijikstra
- 1018. Public Bike Management (30) PAT 甲级
- PAT1018 Public Bike Management
- PAT-1018 Public Bike Management (30)