PAT 1087【二级最短路】
来源:互联网 发布:php url传递参数 编辑:程序博客网 时间:2024/04/30 02:24
二级最短路+二级最短路,就是DP过程吧。
代码稍微注释一些,毕竟贴代码不好。。
#include<bits/stdc++.h>using namespace std;typedef long long LL;const int INF=0x3f3f3f3f;const int N=4e4+10;struct asd{int cost;int to;int next;}e[N];int head[220],tol,tot;int n,m,w[220];map<string,int>mp;map<int,string>ip;int GetID(string s){if(mp.find(s)!=mp.end()) return mp[s];return mp[s]=++tot;}void init(){tol=tot=0;memset(head,-1,sizeof(head)); }void add(int u,int v,int cost){e[tol].cost=cost;e[tol].to=v;e[tol].next=head[u];head[u]=tol++;}queue<int>q;vector<int>xs;bool vis[220];int pre[N];//记录路径 int dis[220];//距离花费 int hap[220];//到位置 v 的最大开心值 int all[220];//到位置 v 的所有开心值总和 int rotu[220];//到位置 v 的路线条数 int num[220];//到位置 v 的结点个数 int ave[220];//到位置 v 的最大平均数 void SPFA(int s,int t)//利用SPFA算法(最短路比较喜欢的算法,有可能会卡常数。 {xs.clear();while(!q.empty()) q.pop();for(int i=1;i<=n;i++){vis[i]=false;dis[i]=INF;num[i]=rotu[i]=all[i]=hap[i]=0;}pre[s]=-1;rotu[s]=1;vis[s]=true;dis[s]=0;q.push(s);while(!q.empty()){int u=q.front();q.pop();vis[u]=false;for(int i=head[u];~i;i=e[i].next){int v=e[i].to;if(dis[v]>dis[u]+e[i].cost)//一旦这个花费大了,所有都要更新 {pre[v]=u;dis[v]=dis[u]+e[i].cost;all[v]=hap[v]=hap[u]+w[v];rotu[v]=rotu[u];num[v]=num[u]+1;ave[v]=all[v]/num[v];if(!vis[v]){vis[v]=true;q.push(v);}}else if(dis[v]==dis[u]+e[i].cost)//花费相同,更新路径 {rotu[v]+=rotu[u];if(hap[v]<hap[u]+w[v])//开心值取大的 {pre[v]=u;all[v]=hap[v]=hap[u]+w[v];num[v]=num[u]+1;ave[v]=all[v]/num[v];}else if(hap[v]==hap[u]+w[v])//开心值相同,判断最大平均数 {int t_all,t_ave,t_num;t_all=hap[u]+w[v];t_num=num[u]+1;t_ave=t_all/t_num;ave[v]=max(ave[v],t_ave);}}}}int x=t;while(x!=-1){xs.push_back(x);x=pre[x];}printf("%d %d %d %d\n",rotu[t],dis[t],hap[t],ave[t]);int sz=xs.size();for(int i=sz-1;i>=0;i--){if(i!=sz-1) cout<<"->";cout<<ip[xs[i]];}}int main(){string be,st;int x,idx,idy,id,s,t;cin>>n>>m>>be;s=GetID(be);ip[s]=be;for(int i=1;i<n;i++){cin>>be>>x;id=GetID(be);ip[id]=be;w[id]=x;}init();while(m--){cin>>be>>st>>x;idx=GetID(be);idy=GetID(st);add(idx,idy,x);add(idy,idx,x);}t=mp["ROM"];SPFA(s,t);return 0;}
1 0
- PAT 1087【二级最短路】
- Dij二级最短路
- 51nod1459【二级最短路】
- pat 城市救援 最短路
- PAT--1003. Emergency (最短路)
- PAT 甲级 1003Emergency(Dijkstra最短路)
- pat 甲1003. Emergency(最短路)
- PAT(A)1003 Emergency(最短路+计数)
- PAT--1030. Travel Plan(最短路)
- PAT L3-011. 直捣黄龙(求最短路条数,三个关键词优先,最短路路径)
- PAT 1030. Travel Plan (30) (最短路)
- 【PAT】Emergency(最短路条数-SPFA)
- PAT 1018 Public Bike Management(Dijkstra 最短路)
- PAT (Advanced Level) 1003 - Emergency(单元最短路)
- PAT 1072. Gas Station (求n次最短路)
- PAT(A)1111 Online Map (30)(最短路)
- pat L3-011. 直捣黄龙(dij 最短路)
- pat L3-011. 直捣黄龙(最短路+dfs)
- 欢迎使用CSDN-markdown编辑器
- Mac用户福利,学会这些快捷键,瞬间提高逼格
- 计算机视觉、模式识别、机器学习常用牛人主页链接
- Android几种进程
- VSS自动登录设置
- PAT 1087【二级最短路】
- Spring源码分析3----Web环境中的SpringMVC(Web容器中的上下文的设计)
- C/C++中cin,cin.getline,getline的用法
- 用struts2 s2-045漏洞拿站记录
- 关于写入MySQL数据库乱码问题
- LoRaWAN 定位
- mac下配置mysql
- Cocos2dx项目移植Android平台
- python自然语言处理学习资源汇总