- #include <stdio.h>
- #include <string.h>
- #include <vector>
- using namespace std;
- char nodename[21][20],str1[20],str2[20];
- char v[21];
- int nodes,edges,limit,w;
- int groups[21],count,p[21];
- int best[21],from,to;
- int g[21][21],ng[21][21];
- class Heap {
- int array[30],w[30];
- int size;
- public:
- Heap() {size=0;}
- void Insert(int a,int b) {
- int t;
- array[size]=a; w[size++]=b;
- if(b<w[0]) {
- t=array[0]; array[0]=array[size-1]; array[size-1]=t;
- t=w[0]; w[0]=w[size-1]; w[size-1]=t;
- }
- }
- int DeleteMin(int &weight) {
- int ans=array[0]; weight=w[0];
- if(size==1) { size=0; weight=w[0]; return ans; }
- int min=w[1],p=1;
- for(int i=2;i<size;i++)
- if(w[i]<min) {
- min=w[i];
- p=i;
- }
- array[0]=array[p]; w[0]=w[p];
- for(int i=p+1;i<size;i++) array[i-1]=array[i],w[i-1]=w[i];
- size--;
- return ans;
- }
- bool Update(int a,int b) {
- int i;
- for(i=0;i<size;i++)
- if(array[i]==a&&w[i]>b) { w[i]=b; break; }
- if(i==size) return false;
- int min=w[0],p=0;
- for(int i=1;i<size;i++)
- if(w[i]<min) {
- min=w[i];
- p=i;
- }
- int t;
- t=array[0]; array[0]=array[p]; array[p]=t;
- t=w[0]; w[0]=w[p]; w[p]=t;
- return true;
- }
- bool IsEmpty() { return size==0; }
- };
- void DFS(int u,int b)
- {
- v[u]=true;
- for(int w=0;w<nodes;w++)
- if(!v[w]&&ng[u][w]) {
- p[w]=u;
- int t=b;
- if(u==0) t=-99999999;
- if(b<ng[u][w]) t=ng[u][w];
- best[w]=t;
- DFS(w,t);
- }
- }
- int Find(char *s) {
- for(int i=0;i<nodes;i++)
- if(strcmp(s,nodename[i])==0) return i;
- strcpy(nodename[nodes++],s);
- return nodes-1;
- }
- int main()
- {
- int times;
- strcpy(nodename[0],"Park");
- scanf("%d",×);
- for(int c=0;c<times;c++) {
- if(c) puts("");
- memset(g,0,sizeof(g));
- memset(ng,0,sizeof(ng));
- scanf("%d",&edges);
- nodes=1;
- for(int i=0;i<edges;i++) {
- scanf("%s %s %d",str1,str2,&w);
- int a=Find(str1),b=Find(str2);
- g[a][b]=g[b][a]=w;
- }
- scanf("%d",&limit);
- memset(v,0,sizeof(v));
- count=0;
- for(int i=1;i<nodes;i++)
- if(!v[i]) {
- count++;
- Heap s;
- s.Insert(i,0);
- p[i]=-1;
- while(!s.IsEmpty()) {
- int w;
- int u=s.DeleteMin(w);
- v[u]=2; groups[u]=count;
- if(p[u]!=-1) {
- ng[p[u]][u]=ng[u][p[u]]=w;
- }
- for(int j=1;j<nodes;j++) {
- if(g[u][j]) {
- if(v[j]==0) {
- s.Insert(j,g[u][j]);
- p[j]=u;
- v[j]=1;
- }
- else if(v[j]==1) {
- if(s.Update(j,g[u][j])) {
- p[j]=u;
- }
- }
- }
- }
- }
- }
- for(int i=1;i<=count;i++) {
- int min=99999999,p;
- for(int j=0;j<nodes;j++)
- if(groups[j]==i&&g[0][j]&&g[0][j]<min) {
- min=g[0][j]; p=j;
- }
- ng[0][p]=ng[p][0]=min;
- }
- for(int i=count+1;i<=limit;i++) {
- memset(v,0,sizeof(v));
- best[0]=-99999999;
- DFS(0,-99999999);
- int min=0,s,t;
- for(int i=0;i<nodes;i++)
- if(g[0][i]&&(g[0][i]-best[i]<min)) {
- min=g[0][i]-best[i];
- s=t=i;
- }
- if(min==0) break;
- while(true) {
- if(g[p[s]][s]!=best[s]) s=p[s];
- else {
- ng[p[s]][s]=ng[s][p[s]]=0;
- ng[0][t]=ng[t][0]=g[0][t];
- break;
- }
- }
- }
- int sum=0;
- for(int i=0;i<nodes;i++)
- for(int j=0;j<nodes;j++)
- if(ng[i][j]) {
- sum+=ng[i][j];
- }
- printf("Total miles driven: %d\n",sum/2);
- }
- return 0;
- }