All Roads Lead to Rome(30)(MAP【int,string】,邻接表,DFS,模拟,SPFA)(PAT甲级)
#include<bits/stdc++.h>
using namespace std;
map<string,int>city;
map<int,string>rcity;
map<int,vector<pair<int,int> > >edge;//对比string要比对比int慢很多,所以转换映射
int dis[207],path[207],hcount[207],happ[207],fstep[207],f[207];//源点到各点的最短距离,最短路径数量,快乐总数,快乐,经过点的个数,前一个点
int vis[207];
int main(){
memset(dis,-1,sizeof(dis));
memset(hcount,-1,sizeof(hcount));
std::ios::sync_with_stdio(false);//关闭同步
int n,k,i,d,s;
string st,u,v;
cin>>n>>k>>st;
city[st]=0;//编号
rcity[0]=st;//反编号
happ[0]=0;
dis[0]=0;
hcount[0]=0;
fstep[0]=0;
path[0]=1;//init
f[0]=0;
for(i=1;i<n;++i){
f[i]=i;
cin>>u;
rcity[i]=u;
city[u]=i;
cin>>happ[i];
}
for(i=0;i<k;++i){
cin>>u>>v>>d;
edge[city[u]].push_back(make_pair(city[v],d));//建邻接表
edge[city[v]].push_back(make_pair(city[u],d));
}
s=0;
vector<pair<int,int> >::iterator it;
int next;
while(s!=city["ROM"]){
vis[s]=1;
for(it=edge[s].begin();it!=edge[s].end();++it){
next=it->first;
if(dis[next]==-1||dis[next]>dis[s]+it->second){//松弛
dis[next]=dis[s]+it->second;
hcount[next]=hcount[s]+happ[next];
path[next]=path[s];
fstep[next]=fstep[s]+1;
f[next]=s;
}
else{
if(dis[next]==dis[s]+it->second){
path[next]+=path[s];
if(hcount[next]<hcount[s]+happ[next]){
hcount[next]=hcount[s]+happ[next];
fstep[next]=fstep[s]+1;
f[next]=s;
}
else{
if(hcount[next]==hcount[s]+happ[next]){
if(fstep[next]>fstep[s]+1){
fstep[next]=fstep[s]+1;
f[next]=s;
}
}
}
}
}
}
int mindis=-1,minnum;
for(i=1;i<n;i++){
if(dis[i]==-1)//如果当前边到不了初始点,直接pass
continue;
if(!vis[i]&&(mindis==-1||(dis[i]<mindis))){
mindis=dis[i];
minnum=i;
}
}
s=minnum;//找到当前距离源点最近的一个点向下搜索
}
cout<<path[s]<<" "<<dis[s]<<" "<<hcount[s]<<" "<<hcount[s]/fstep[s]<<endl;
int p=s;
stack<int>ss;
while(p){
ss.push(p);
p=f[p];
}
cout<<rcity[p];
while(!ss.empty()){
cout<<"->"<<rcity[ss.top()];
ss.pop();
}
return 0;
}
/*#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9 ;
typedef struct node{
int v;//节点编号
int cost;//边权值
};
int N;//城市数量
int K;//道路条数
string start;//起始点城市名字
int happy[207];//存放各个城市的快乐值
map<string,int>stringToInt;//城市名字->编号
map<int,string>intToString;//编号->城市名字
vector<node>graph[207];//邻接表
int d[207];//记录从起始城市到达点i的最少花费值
vector<int>pre[207];//记录前一个节点
vector<int>path,tempPath;
int optHappy=0;
double optAverageHappy=0;
int cnt=0;//记录最短路径条数
int inq[207];//记录节点是否在队列中
void spfa(int s){
for(int i=0;i<N;++i)
d[i]=INF;
d[s]=0;
queue<int>q;
q.push(s);
inq[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
inq[u]=0;
for(int j=0;j<graph[u].size();++j){
int v=graph[u][j].v;
int cost=graph[u][j].cost;
if(!v)
continue;
if(d[u]+cost<d[v]){
d[v]=d[u]+cost;
pre[v].clear();
pre[v].push_back(u);
if(!inq[v]){
q.push(v);
inq[v]=1;
}
}
else if(d[u]+cost==d[v])
pre[v].push_back(u);
}
}
}
void dfs(int nowVisit){
if(!nowVisit){
cnt++;
tempPath.push_back(nowVisit);
int happyValue=0;
for(int i=tempPath.size()-2;i>=0;--i)
happyValue+= happy[tempPath[i]];
double averageHappyValue=1.0*happyValue/(tempPath.size()-1);
if(happyValue>optHappy){
optHappy=happyValue;
optAverageHappy=averageHappyValue;
path=tempPath;
}
else if(happyValue==optHappy&&averageHappyValue>optAverageHappy){
optAverageHappy=averageHappyValue;
path=tempPath;
}
tempPath.pop_back();
return;
}
tempPath.push_back(nowVisit);
for(auto&it:pre[nowVisit])
dfs(it);
tempPath.pop_back();
}
int main(){
std::ios::sync_with_stdio(false);//关闭同步
cin>>N>>K>>start;
stringToInt[start]=0; //起始城市编号为0
intToString[0]=start;
string city;
int happyness;
for(int i=1;i<N;++i){
cin>>city>>happyness;
stringToInt[city]=i;
intToString[i]=city;
happy[i]=happyness;
}
string city1,city2;
int cost;
for(int i=0;i<K;++i){
cin>>city1>>city2>>cost;
int id1=stringToInt[city1];
int id2=stringToInt[city2];
node x,y;
x.v=id2;
x.cost=cost;
y.v=id1;
y.cost=cost;
graph[id1].push_back(x);
graph[id2].push_back(y);
}
int destination=stringToInt["ROM"];
spfa(0);
dfs(destination);
cout<<cnt<<" "<<d[destination]<<" "<<optHappy<<" "<<(int)optAverageHappy<<endl;
for(int i=path.size()-1;i>=0;--i) {
cout<<intToString[path[i]];
if(i)
cout<<"->";
}
return 0;
}*/
//SPFA先处理再DFS
All Roads Lead to Rome(30)(MAP【int,string】,邻接表,DFS,模拟,SPFA)(PAT甲级)的更多相关文章
- [图的遍历&多标准] 1087. All Roads Lead to Rome (30)
1087. All Roads Lead to Rome (30) Indeed there are many different tourist routes from our city to Ro ...
- pat1087. All Roads Lead to Rome (30)
1087. All Roads Lead to Rome (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- 1087. All Roads Lead to Rome (30)
时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Indeed there are many different ...
- PAT甲级练习 1087 All Roads Lead to Rome (30分) 字符串hash + dijkstra
题目分析: 这题我在写的时候在PTA提交能过但是在牛客网就WA了一个点,先写一下思路留个坑 这题的简单来说就是需要找一条最短路->最开心->点最少(平均幸福指数自然就高了),由于本题给出的 ...
- PAT (Advanced Level) 1087. All Roads Lead to Rome (30)
暴力DFS. #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...
- 1087 All Roads Lead to Rome (30)(30 分)
Indeed there are many different tourist routes from our city to Rome. You are supposed to find your ...
- 【PAT甲级】1087 All Roads Lead to Rome (30 分)(dijkstra+dfs或dijkstra+记录路径)
题意: 输入两个正整数N和K(2<=N<=200),代表城市的数量和道路的数量.接着输入起点城市的名称(所有城市的名字均用三个大写字母表示),接着输入N-1行每行包括一个城市的名字和到达该 ...
- PAT 1087 All Roads Lead to Rome[图论][迪杰斯特拉+dfs]
1087 All Roads Lead to Rome (30)(30 分) Indeed there are many different tourist routes from our city ...
- PAT_A1087#All Roads Lead to Rome
Source: PAT A1087 All Roads Lead to Rome (30 分) Description: Indeed there are many different tourist ...
随机推荐
- C#统计目录中文件MD5值
1. [代码]统计目录中文件MD5值 using System.IO;using System.Security.Cryptography;using System.Collections;using ...
- mvc购物车项目
第一个mvc项目--购物车. 1.购物车需求 a.用户可以登录 b.用户可以购买商品 c.用户可以对购物车的商品进行修改和删除 d.用户可以下订单 e.系统可以发送电子邮件给用户 uml图 2.界面设 ...
- MySQL查询in操作 查询结果按in集合顺序显示
偶尔看到的...或许有人会注意过,但我以前真不知道 SQL: select * from table where id IN (3,6,9,1,2,5,8,7); 这样的情况取出来后,其实,id还是按 ...
- PL/SQL Developer 的 SQL 编辑窗口显示行号
版权声明:本文为博主原创文章,未经博主允许不得转载. 一直奇怪为什么 PL/SQL 6 系列的版本可以显示行号,为什么到了 7 .8 版本之后反而还不行了?而且我都已经设置了“显示行号”的呀. 如图: ...
- 封装一个简单的Hibernate SessionFactory
封装Hibernate框架中的session工厂 ,方便很多,免去了很多重复无用的代码 package com.maya.test; import org.hibernate.*; import ...
- PHP把时间转换成几分钟前、几小时前、几天前的几个函数、类分享
这篇文章主要介绍了php计算时间几分钟前.几小时前.几天前的几个函数.类分享,需要的朋友可以参考下一.函数实现实例1: <?php header("Content-type: text ...
- hibernate复习第(三)天
今日要点: 1.继承关系映射 一个表对应一个映射树(subclass) 一个子类一个表,子类只有父类没有的字段(joined-subclass) 鉴别器和内连接结合使用(subclass join) ...
- Java丨jsoup网络爬虫模拟登录思路解析
直奔主题: 本篇文章是给有jsoup抓包基础的人看的...... 今天小编给大家写一篇对于jsoup抓包时需要输入验证码的解决方法之一.大神就绕道,嘿嘿~ 任何抓包的基础都是基于Http协议来进行这个 ...
- bzoj 4773: 负环 floyd
题目: 对于边带权的有向图,找出一个点数最小的环,使得环上的边权和为负. 2 <= n <= 300. 题解: 我们可以考虑从小到大枚举答案. 然后每次枚举更大的答案的时候就从当前的较小的 ...
- 【C/C++】scanf,printf 函数
摘自http://www.cplusplus.com 1. scanf 函数 int scanf ( const char * format, ... ); Parameters format C s ...