1087 All Roads Lead to Rome (30分)
阿新 • • 發佈:2020-09-15
1087All Roads Lead to Rome(30分)
#include<stdio.h> #include<vector> #include<map> #include<string> #include<iostream> #include<algorithm> using namespace std; const int maxn=1010; const int INF=1000000000; int n,m; int G[maxn][maxn],d[maxn]; int weight[maxn],w[maxn]; int vis[maxn]={0}; vector<int>path,temppath,pre[maxn]; map<string,int>mp1; map<int,string>mp2; int maxhappy=0,minpoint=INF; void dijkstra(int s){ fill(d,d+maxn,INF); fill(w,w+maxn,0); d[s]=0; w[s]=0; for(int i=0;i<n;i++){ int u=-1,min=INF; for(int j=0;j<n;j++){ if(vis[j]==0&&d[j]<min){ u=j; min=d[j]; } } if(u==-1)return; vis[u]=1; for(int v=0;v<n;v++){ if(vis[v]==0&&G[u][v]!=INF){ if(d[u]+G[u][v]<d[v]){ d[v]=d[u]+G[u][v]; pre[v].clear(); pre[v].push_back(u); } else if(d[u]+G[u][v]==d[v]){ pre[v].push_back(u); } } } } } int b=0; void DFS(int v){ if(v==0){ b++; temppath.push_back(v); int sumvalue=0; for(int i=temppath.size()-1;i>=0;i--){ int id=temppath[i]; sumvalue+=weight[id]; } int pointcnt=temppath.size(); if(sumvalue>maxhappy){ maxhappy=sumvalue; minpoint=pointcnt; path=temppath; } else if(sumvalue==maxhappy&&pointcnt<minpoint){ minpoint=pointcnt; path=temppath; } temppath.pop_back(); return; } temppath.push_back(v); for(int i=0;i<pre[v].size();i++){ DFS(pre[v][i]); } temppath.pop_back(); } int main() { string start,str1,str2; scanf("%d %d",&n,&m); cin>>start; mp1[start]=0; mp2[0]=start; for(int i=1;i<n;i++){ cin>>start>>weight[i]; mp1[start]=i; mp2[i]=start; } fill(G[0],G[0]+maxn*maxn,INF); for(int i=0;i<m;i++){ cin>>str1>>str2; int id1=mp1[str1],id2=mp1[str2]; cin>>G[id1][id2]; G[id2][id1]=G[id1][id2]; } dijkstra(0); DFS(mp1["ROM"]); printf("%d %d %d %d\n",b,d[mp1["ROM"]],maxhappy,maxhappy/(minpoint-1)); // 第一次錯誤原因 沒有減一,計算平均值第一個城市是不計算在內的 for(int i=path.size()-1;i>=0;i--){ int id3=path[i]; cout<<mp2[id3]; if(i!=0)printf("->"); } return 0; }