0
点赞
收藏
分享

微信扫一扫

PAT (Advanced Level) Practice - 1087 All Roads Lead to Rome(30 分)


题目链接:​​点击打开链接​​

题目大意:略。

解题思路:经典。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

typedef long long ll;

const int maxn=250;

int n,m,w,d;
// 幸福指数rs 幸福指数 记录访问 最短距离rs 路径记录 路径条数 结点个数
int cst[maxn], cost[maxn], vis[maxn], dis[maxn], pre[maxn], path[maxn], vex[maxn];
int g[maxn][maxn];
string s,su,sv;
unordered_map<int,string> name;
unordered_map<string,int> id;

void init()
{
mem(dis,INF), mem(g,INF), mem(pre,-1);
mem(vis,0), mem(cost,0), mem(path,0), mem(vex,0), mem(cst,0);
}

int dijkstra(int v)
{
dis[v]=0, path[v]=1;
while(1)
{
int mi=INF;
v=-1;
for(int i=1;i<=n;i++)
if(!vis[i] && dis[i]<mi)
mi=dis[i], v=i;

if(v==d) return 1;
if(v==-1) return 0;
vis[v]=1;

for(int i=1;i<=n;i++)
{
if(!vis[i] && mi+g[v][i]<dis[i])
{
dis[i]=mi+g[v][i];
cst[i]=cst[v]+cost[i];
path[i]=path[v];
vex[i]=1+vex[v];
pre[i]=v;
}
else if(!vis[i] && mi+g[v][i]==dis[i])
{
path[i]+=path[v];
if(cst[i]<cst[v]+cost[i])
{
cst[i]=cst[v]+cost[i];
vex[i]=1+vex[v];
pre[i]=v;
}
else if(cst[i]==cst[v]+cost[i] && vex[i]>vex[v]+1)
{
vex[i]=vex[v]+1;
pre[i]=v;
}
}
}
}
}

int main()
{
init();
scanf("%d%d",&n,&m), cin>>s;
name[1]=s, id[s]=1, cost[1]=0;
for(int i=2;i<=n;i++)
{
cin>>su>>w;
name[i]=su, id[su]=i, cost[i]=w;
if(su=="ROM") d=i;
}
for(int i=0;i<m;i++)
{
cin>>su>>sv>>w;
g[id[su]][id[sv]]=g[id[sv]][id[su]]=w;
}

if(dijkstra(id[s]))
{
vector<int> vec;
printf("%d %d %d %d\n",path[d],dis[d],cst[d],int(cst[d]*1.0/vex[d]));
int h=d;
while(h!=-1)
{
vec.push_back(h);
h=pre[h];
}
for(int i=vec.size()-1;i>=0;i--)
printf("%s%s",name[vec[i]].c_str(),i==0?"\n":"->");
}
else puts("-1");

return 0;
}


举报

相关推荐

0 条评论