【PAT】1018. Public Bike Management
2016-02-16 22:57
344 查看
先dijkstra搜索出所有最短路径,然后dfs出send最少的和take back最少的路径
#include<cstdio> #include<stack> #include<vector> #include<algorithm> #include<queue> using namespace std; const int maxn = 550; const int INF = 1000000000; int n,cmax,s,road; int G[maxn][maxn],cnt[maxn]; vector<int> pre[maxn],temppath,path; int d[maxn]; bool visit[maxn] = {false}; int minsend=INF,minback=INF; void dijkstra(int s){ fill(d,d+maxn,INF); d[s] = 0; for(int i=0;i<maxn;i++) pre[i].push_back(i); for(int i=0;i<=n;++i){ int u=-1,min=INF; for(int j=0;j<=n;j++) if(visit[j]==false && d[j]<min){ u = j; min = d[j]; } if(u == -1) return; visit[u] = true; for(int v=0;v<=n;++v){ if(visit[v]==false&&G[u][v]!=INF){ if(d[u] + G[u][v] < d[v]){ pre[v].clear(); pre[v].push_back(u); d[v] = d[u] + G[u][v]; } else if(d[u]+G[u][v] == d[v]) pre[v].push_back(u); } } } } void dfs(int v){ if(v == 0){ temppath.push_back(v); int tempsend=0,tempback=0; for(int i=temppath.size()-2;i>=0;--i){ if(cnt[temppath[i]] < cmax){ if(tempback >= (cmax-cnt[temppath[i]]) ){ tempback -= (cmax-cnt[temppath[i]]); } else{ tempsend += (cmax-cnt[temppath[i]]-tempback); tempback = 0; } } else if(cnt[temppath[i]] > cmax){ tempback += (cnt[temppath[i]] - cmax); } } if(tempsend < minsend){ minsend = tempsend; path = temppath; minback = tempback; }else if(tempsend == minsend && tempback < minback){ minback = tempback; path = temppath; } temppath.pop_back(); return ; } temppath.push_back(v); for(int i=0;i<pre[v].size();++i){ dfs(pre[v][i]); } temppath.pop_back(); } int main() { scanf("%d%d%d%d",&cmax,&n,&s,&road); cmax /= 2; fill(G[0],G[0]+maxn*maxn,INF); for(int i=1;i<=n;i++) scanf("%d",&cnt[i]); while(road--){ int s1,s2,dis; scanf("%d%d%d",&s1,&s2,&dis); G[s1][s2] = G[s2][s1] = dis; } dijkstra(0); dfs(s); printf("%d ",minsend); for(int i=path.size()-1;i>=0;i--){ printf("%d",path[i]); if(i>0) printf("->"); } printf(" %d",minback); }
相关文章推荐
- NSDictionary字典的常用方法
- 异步分页实现步骤
- Activity的四种加载模式
- SelectObject()函数
- 【设计模式】外观模式
- 折半查找法
- 4.14-2 如何使用Android MediaStore裁剪大图片
- tcp与udp socket使用上面的区别
- 对正则表达式的简单学习
- hdu 5470 Typewriter
- Hqueue Distributed Simulations(Houdini分机解算)
- update-database 到azure sql database
- UIPopoverController的使用
- 求一组数的平均数(利用可变参数列表)
- 正则表达式抓取网页数据 制作iOS小词典
- python基础第四天(1)
- BootStrap学习
- [电影]人生苦短,及时行乐
- compare `lvs/haproxy/nginx`
- CF543C 让所有的串成为独特的串的最小代价(状压dp,贪心)