1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <map> #include <iostream> #define MAXN 35 #define INF 0x3f3f3f3f using namespace std;
int n=1, m, t, s, z, tree[MAXN][MAXN], graph[MAXN][MAXN], ans; int f[MAXN], min_dis[MAXN], min_to[MAXN]; string x, y; map <string, int> mmp; pair<int, int> edge[MAXN*MAXN], maxe[MAXN];
bool CMP(pair<int, int> x, pair<int, int> y) { return graph[x.first][x.second]<graph[y.first][y.second]; }
void init() { mmp["Park"]=1; memset(graph, 0x3f, sizeof(graph)); memset(tree, -1, sizeof(tree)); memset(min_dis, 0x3f, sizeof(min_dis)); for(int i=1; i<MAXN; i++) f[i]=i; }
int find(int x) { if(f[x]!=x) f[x]=find(f[x]); return f[x]; }
void Kruskal() { for(int i=1; i<=n; i++) f[i]=i; sort(edge+1, edge+m+1, CMP); for(int i=1; i<=m; i++) { int x=edge[i].first, y=edge[i].second; int fx=find(x), fy=find(y); if(fx==fy || x==1 || y==1) continue; f[fx]=fy; tree[y][x]=tree[x][y]=graph[x][y]; ans+=graph[x][y]; } }
void dfs(int x, int fa) { for(int i=2; i<=n; i++) { if(i==fa || tree[x][i]==-1) continue; int u=maxe[x].first, v=maxe[x].second; if(tree[u][v]>tree[x][i]) maxe[i]=make_pair(u, v); else maxe[i]=make_pair(x, i); dfs(i, x); } }
int main() { ios::sync_with_stdio(false); init(); scanf("%d", &m); for(int i=1; i<=m; i++) { cin>>x>>y>>z; if(mmp[x]==0) mmp[x]= ++n; if(mmp[y]==0) mmp[y]= ++n; graph[mmp[x]][mmp[y]]=z; graph[mmp[y]][mmp[x]]=z; edge[i]=make_pair(mmp[x], mmp[y]); } scanf("%d", &s); Kruskal(); for(int i=2; i<=n; i++) { int x=find(i); if(min_dis[x]>graph[1][i]) { min_dis[x]=graph[1][i]; min_to[x]=i; } } for(int i=1; i<=n; i++) { if(min_dis[i]==INF) continue; tree[1][min_to[i]]=min_dis[i]; tree[min_to[i]][1]=min_dis[i]; ans+=min_dis[i]; t++; } for(int i=t+1; i<=s; i++) { int minn=INF, to, u, v; memset(maxe, 0, sizeof(maxe)); dfs(1, -1); for(int j=2; j<=n; j++) { int x=maxe[j].first, y=maxe[j].second; if(minn<graph[1][j]-tree[x][y]) continue; minn=graph[1][j]-tree[x][y]; to=j; u=x, v=y; } if(minn>=0) break; tree[1][to]=tree[to][1]=graph[1][to]; tree[u][v]=tree[v][u]=-1; ans+=minn; } printf("Total miles driven: %d\n", ans); }
|