PAT1003. Emergency
来源:互联网 发布:网站seo初学者教程 编辑:程序博客网 时间:2024/05/27 20:18
这个和之前的一个城市间紧急救援差不多,那个用的是dijkstra算法,但我看有人用dfs写的更简单,我也用dfs写了一下。
#include<iostream>#include<algorithm>using namespace std;const int N=505,M=~(1<<31);int n,m,s,d,val[N],adj[N][N];int dist=M,team=0,way;bool used[N];void dfs(int k,int dis,int sum){ if(k==d) { if(dis<dist) { dist=dis; way=1; team=sum; } else if(dis==dist) { ++way; if(team<sum) team=sum; } return; } for(int i=0;i<n;++i) if(!used[i]&&adj[k][i]!=M) { used[i]=true; dfs(i,dis+adj[k][i],sum+val[i]); used[i]=false; }}void initial(){ cin>>n>>m>>s>>d; for(int i=0;i<n;++i) cin>>val[i]; fill(*adj,*adj+N*N,M); for(int i=0;i<m;++i) { int a,b,c; cin>>a>>b>>c; adj[a][b]=adj[b][a]=c; } used[s]=true;}int main(){ initial(); dfs(s,0,val[s]); cout<<way<<' '<<team;}
但这种方法是不靠谱的,复杂度太高,用dijkstra才是王道
#include<algorithm>#include<iostream>#include<bitset>using namespace std;const int N=502,INF=1<<30;int dis[N],team[N],adj[N][N],mteam[N],path[N];int s,d,n,m;void dijkstra(){ bitset<N>used; dis[s]=0,mteam[s]=team[s],path[s]=1; while(true){ int next=-1,mmin=INF; for(int i=0;i<n;++i) if(!used[i] && dis[i]<mmin)mmin=dis[next=i]; if(next==-1)break; used.set(next); for(int i=0;i<n;++i)if(!used[i]&&adj[next][i]!=INF){if(dis[next]+adj[next][i]<dis[i]){ dis[i]=dis[next]+adj[next][i]; mteam[i]=mteam[next]+team[i]; path[i]=path[next];}else if(dis[next]+adj[next][i]==dis[i]){ path[i]+=path[next]; mteam[i]=max(mteam[next]+team[i],mteam[i]);}//else if }//if(!used.. }//while} int main(){ cin>>n>>m>>s>>d; for(int i=0;i<n;++i)cin>>team[i]; fill_n(*adj,N*N,INF); fill_n(dis,N,INF); while(m--){ int a,b,c;cin>>a>>b>>c; adj[a][b]=adj[b][a]=c; } dijkstra(); cout<<path[d]<<' '<<mteam[d]; return 0; }dijkstra算法每个点保持三个性质,当前到该点的最短路径长度(一开始是INF啦),当前到该点的最短路径数目,当前由最短路径到该店的最大救援队数目,第二个性质感觉有点dp的味道。。
0 0
- PAT1003. Emergency
- pat1003 Emergency
- pat1003. Emergency
- PAT1003. Emergency (25)
- PAT1003. Emergency (25)
- PAT1003
- PAT1003
- PAT1003
- pat1003
- pat1003
- pat1003
- PAT1003
- PAT1003
- PAT1003
- PAT1003
- pat1003
- Emergency
- emergency
- 无题
- 测试手机网页
- 看苹果出的面试难题!!!
- 完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三
- UILabel标签自适应高度的设置
- PAT1003. Emergency
- scrollview上下滚动效果触发相关事件
- php 抽象类 静态 单体设计模式
- 各种总线match匹配函数
- AFNetworking 2.0
- TP-LINK 150M无线宽带路由器TL-WR740N 路由器当无线AP(交换机用)
- POJ 2096 概率dp
- 点击状态栏返回到表视图顶端
- 关于Heap free block xxxxxxxx modified at xxxxxxxxx after is was freed