第六章 图论 4 AcWing 1577. 条条大路通罗马
原题链接
算法标签
图论 单源最短路 dijkstra
思路
具体思路见代码
代码
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
// #define x first
// #define y second
#define ump unordered_map
#define pq priority_queue
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>=b;--i)
using namespace std;
typedef pair<int, int> PII;
const int N = 205;
//int t, n, m, cnt, ans;
int n, m;
// d[i][j] 表示城市i,j之间的道路行走的花费 案的数量 w[i] 表示城市i(初始城市除外)可以获得的幸福感 dist[i] 到达城市i的最短距离 cnt[i] 到达城市i的最短路数量 cost[i] 到达城市i的最短距离 cnt[i] 到达城市i的最短路数量
int d[N][N], w[N], cost[N], sum[N], cnt[N], pre[N], dist[N];
bool st[N];
string city[N];
ump<string, int> mp;
vector<int> path;
inline int rd(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar(x%10^48);
}
void dij(){
memset(dist, 0x3f, sizeof dist);
dist[1]=0, cnt[1]=1;
rep(i, 0, n){
int t=-1;
rep(j, 1, n+1){
if(!st[j]&&(t==-1||dist[t]>dist[j])){
t=j;
}
}
st[t]=true;
rep(j, 1, n+1){
// 最少耗费优先
if(dist[j]>dist[t]+d[t][j]){
// 更新最小花费
dist[j]=dist[t]+d[t][j];
// 更新方案数
cnt[j]=cnt[t];
// 更新幸福感
cost[j]=cost[t]+w[j];
// 更新经过城市的数量
sum[j]=sum[t]+1;
pre[j]=t;
}
// 耗费相等
else if(dist[j]==dist[t]+d[t][j]){
// 方案数不唯一 累加
cnt[j]+=cnt[t];
// 幸福感为第二标准
if(cost[j]<cost[t]+w[j]){
// 更新幸福感
cost[j]=cost[t]+w[j];
// 更新经过城市的数量
sum[j]=sum[t]+1;
pre[j]=t;
}else if(cost[j]==cost[t]+w[j]){
// 所经过城市数量为第三标准
if(sum[j]>sum[t]+1){
// 更新经过城市的数量
sum[j]=sum[t]+1;
pre[j]=t;
}
}
}
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>city[1];
mp[city[1]]=1;
rep(i, 2, n+1){
cin>>city[i]>>w[i];
mp[city[i]]=i;
}
memset(d, 0x3f, sizeof d);
while(m--){
string x, y;
int c;
cin>>x>>y>>c;
int a=mp[x], b=mp[y];
d[a][b]=d[b][a]=min(d[a][b], c);
}
dij();
int T=mp["ROM"];
cout<<cnt[T]<<" "<<dist[T]<<" "<<cost[T]<<" "<<cost[T]/sum[T]<<"\n";
vector<int> path;
for(int i=T; i!=1; i=pre[i]){
path.push_back(i);
}
cout<<city[1];
Rep(i, path.size()-1, 0){
cout<<"->"<<city[path[i]];
}
return 0;
}
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈