1. 程式人生 > 實用技巧 >1087 All Roads Lead to Rome (30分)

1087 All Roads Lead to Rome (30分)

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;
}