蒟蒻刚学 OI,MLE #6 #8 #11
查看原帖
蒟蒻刚学 OI,MLE #6 #8 #11
1657369
__liujy楼主2025/7/26 13:14
// P7297 [USACO21JAN] Telephone G
#include<bits/stdc++.h>
const int MAXN=5e4+5,MAXK=55;
const int INF=0x7f7f7f7f;
typedef long long LL;
typedef std::pair<int,LL> PIL;
typedef std::pair<LL,int> PLI;
int n,k,b[MAXN],a[MAXK][MAXK];
LL dis[MAXN];
bool vis[MAXN];
std::vector<PIL> e[MAXN];
std::vector<int> v[MAXK];
inline void dij(int s)
{
    std::priority_queue<PLI> pq;
    pq.push(std::make_pair(0LL,s));
    for(int i=1;i<=n;i++)
        dis[i]=INF,
        vis[i]=0;
    dis[s]=0;
    while(pq.size())
    {
        int u=pq.top().second;
        pq.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(auto it:e[u])
        {
            int v=it.first;
            LL w=it.second;
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                if(!vis[v]) pq.push(std::make_pair(-dis[v],v));
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    for(int i=1;i<=n;i++) v[b[i]].push_back(i);
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
        {
            char ch;
            std::cin>>ch;
            a[i][j]=(ch^48);
        }
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
        {
            if(a[i][j]==0) continue;
            for(int it1:v[i])
                for(int it2:v[j])
                    e[it1].push_back(std::make_pair(it2,abs(it1-it2)));
        }
    dij(1);
    if(dis[n]==INF) printf("-1\n");
    else printf("%lld\n",dis[n]);
    return 0;
}
2025/7/26 13:14
加载中...