按照这样的写法我只拿了40分,求助
查看原帖
按照这样的写法我只拿了40分,求助
236462
EasonKotori楼主2021/4/3 10:22
#include<bits/stdc++.h>
using namespace std;
int dis[105][105];
int n;
int p;
int tre[20];
bool used[20];
int qpl[12];
int ans=99999999;
void cal(int a[])
{
    int cnt=0;
    if(p!=1)
    {
        for(int i=0; i<p-1; i++)
            cnt+=dis[qpl[i]][qpl[i+1]];
        cnt+=dis[qpl[p-1]][n];
    }
    if(p==1)
        cnt=dis[1][tre[0]]+dis[tre[0]][n];
    ans=min(ans,cnt);
}
void dfs(int k)
{
    if(k==p)
    {
        cal(qpl);
        return;
    }
    for(int i=0; i<p; i++)
    {
        if(!used[i])
        {
            used[i]=1;
            qpl[k]=tre[i];
            dfs(k+1);
            used[i]=0;
        }
    }
}
int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            cin>>dis[i][j];
    cin>>p;

    for(int i=0; i<p; i++)
        cin>>tre[i];
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    dfs(0);
    cout<<ans;
}

2021/4/3 10:22
加载中...