pat 1018. Public Bike Management (dijkstra+dfs)
来源:互联网 发布:淘宝官方网电话是多少 编辑:程序博客网 时间:2024/05/29 12:30
最短路问题,复习dijkstra和dfs
首先dijkstra求出最短路,然后dfs求出所有路径
求出路径中send最小的,再求其中back最小的
point:题设的要求是修正最短路径上的所有点,实际上必须严格遵循访问顺序修改每个点的权值(eg:要依次修改权值分别为3,10的两个点,必须send2back5而非简单地back3),亦即到达目标点sp后的回程是不能修改的。
如果错误地理解为简单地将最短路径上的所有点上的权值全部改为half-full的话,会有两个case过不了
#include<stdio.h>#include<iostream>#include<stack>#include<map>#include<string>#include<algorithm>using namespace std;int cmax,n,sp,m,longest;const int MAX=0x7fffffff;const int number=510;int in[number];int ld[number][number];int dis[number];int bl[number];int pre[number];int change[number];stack<int> sta;multimap<int,string> mp;multimap<int,string> mp2;multimap<int,string>::iterator mi;int used[number];int mm=MAX;int minsum=MAX;string itos(int num){string s="";if(num<10){s=" ";s[0]=(num+'0');} if(num>=10&&num<=99){s=" ";s[0]=(num%10+'0');s[1]=(num/10+'0');}if(num>=100){s=" ";s[0]=(num%10+'0');s[1]=((num/10)%10+'0');s[2]=(num/100+'0');} return s;}void dijkstra(int start) {int min,i,u,j;bl[start]=1;for(i=1; i<=n; ++i){dis[i]=ld[start][i];if(dis[i] == MAX)pre[i] = -1;elsepre[i] = start;} for(i=1; i<=n; i++){min=MAX;u=start;for(j=1;j<=n;j++)if(dis[j]<min&&!bl[j]){min=dis[j];u=j;}bl[u]=1;for(j=1;j<=n;j++)if(ld[u][j]<MAX&&!bl[j]){if(dis[u]+ld[u][j]<dis[j]){dis[j]=dis[u]+ld[u][j];pre[j]=u;}}}}void display(){ stack<int> stmp=sta,stmp2;int x=0,sum=0,store=0;string str="";while(!stmp.empty()){x=stmp.top();stmp.pop();if(x==0)break;str+=itos(x);str+=">-";stmp2.push(change[x]);}while(!stmp2.empty()){x=stmp2.top();stmp2.pop();if(x>=0) {store+=x; }else{if(-x<=store){store+=x;}else{ sum+=(-x-store);store=0;}}}str+="0";reverse(str.begin(),str.end()); if(sum>0){if(sum==minsum){mp.insert(make_pair(store,str));}if(sum<minsum){mp.clear();mp.insert(make_pair(store,str));minsum=sum;}}else mp2.insert(make_pair(store,str)); }void dfs(int start,int l){int rd=0,i,u;sta.push(start);if(l>longest) {sta.pop();return; }if(start==sp&&l==longest){ mm=l;display();sta.pop();return;}u=start; for(i=1;i<=n;i++){if(ld[u][i]<=longest&&!used[i]&&u!=i){used[i]=1;dfs(i,l+ld[u][i]);used[i]=0;}}sta.pop();}int main(){ int i,j,s1,s2,t; scanf("%d %d %d %d",&cmax,&n,&sp,&m);for(i=0;i<=n;i++)for(j=0;j<=n;j++)ld[i][j]=MAX;ld[0][0]=0;for(i=1;i<=n;i++){scanf("%d",&in[i]);ld[i][i]=0;}for(i=0;i<m;i++){scanf("%d %d %d",&s1,&s2,&t);ld[s1][s2]=t;ld[s2][s1]=t;}for(i=1;i<=n;i++){change[i]=in[i]-(cmax/2);}dijkstra(0);longest=dis[sp];dfs(0,0);if(!mp2.empty())cout<<"0 "<<mp2.begin()->second<<" "<<mp2.begin()->first<<endl;elsecout<<minsum<<" "<<mp.begin()->second<<" "<<mp.begin()->first<<endl;return 0;}
0 0
- pat 1018. Public Bike Management (dijkstra+dfs)
- PAT 1018. Public Bike Management (dijkstra + dfs + 剪枝)
- PAT-1018 Public Bike Management(dijkstra + dfs)
- 1018. Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS)
- PAT 1018. Public Bike Management (30)(Dijkstra,dfs根据pre[]输出路径,双向计算)
- 【PAT 1001Public Bike Management (30)】+ dfs + dijkstra
- PAT Public Bike Management (dfs)
- PAT 1018 Public Bike Management(Dijkstra 最短路)
- 1018 Public Bike Management --dijkstra+dfs
- PAT 1018. Public Bike Management
- 【PAT】1018. Public Bike Management
- 【PAT】1018. Public Bike Management
- PAT 1018. Public Bike Management
- PAT 1018. Public Bike Management
- PAT 1018 Public Bike Management(最短路径+DFS)
- PAT 1018 Public Bike Management DFS+SPFA
- 1018. Public Bike Management (30) (SPFA + DFS)
- 1018. Public Bike Management (30)-PAT
- 监控 SQL Server 的运行状况--常用检测语句
- How To Draw Graphs with Core Plot, Part 1
- docker app 打包笔记
- 黑马程序员:Java基础——多线程的死锁问题
- 一句感悟
- pat 1018. Public Bike Management (dijkstra+dfs)
- Leetcode:Spiral Matrix与Spiral Matrix II
- 1002正确的版本
- input+div 替代 select
- android PopupWindow显示位置
- JS-asp:RadioButtonList
- 向大师致敬:偶像-乔布斯
- Android 横竖屏切换后继续播放Video
- 算法导论第十章数据结构--双向链表