比赛 2025暑期集训第5场图论专场 评测结果 AAAAATATTTATT
题目名称 Telephone 最终得分 54
用户昵称 ChenBp 运行时间 12.292 s
代码语言 C++ 内存使用 5.11 MiB
提交时间 2025-07-09 11:52:33
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <queue>
#include <cstring>
#define abs(x) ((x)>0?(x):(-(x)))
#define ll long long
using namespace std;
const ll N=5e4+4;
bool s[55][55];
ll b[N];
ll n,k;

ll dfn[N],low[N],scc[N],mn[N],mx[N],cnt=0,scnt=0;
bool ins[N];
stack<ll>st;
void dfs(ll u,ll f){
	dfn[u]=low[u]=++cnt;
	ins[u]=1;
	st.push(u);
	for(ll v=1;v<=n;v++){
		if(!s[b[u]][b[v]]) continue;
		if(!dfn[v]){
			dfs(v,u);
			low[u]=min(low[u],low[v]);
		}else if(ins[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(dfn[u]==low[u]){
		scnt++;
		while(st.top()!=u){
			ins[st.top()]=0;
			scc[st.top()]=scnt;
			mn[scnt]=min(mn[scnt],st.top()); 
			mx[scnt]=max(mx[scnt],st.top());
			st.pop();
		}
		ins[st.top()]=0;
		scc[st.top()]=scnt;
		st.pop();
	}
}
ll dis[N];
ll dc(ll x,ll y){
	ll ans=1e8;
	if(abs(mn[x]-mn[y])<ans) ans=abs(mn[x]-mn[y]);
	if(abs(mx[x]-mn[y])<ans) ans=abs(mx[x]-mn[y]);
	if(abs(mn[x]-mx[y])<ans) ans=abs(mn[x]-mx[y]);
	if(abs(mx[x]-mx[y])<ans) ans=abs(mx[x]-mx[y]);
	return ans;
}
int main() {
	freopen("telephone.in","r",stdin);
	freopen("telephone.out","w",stdout);
	cin>>n>>k;
	for(ll i=1;i<=n;i++){
		cin>>b[i];
	}
	for(ll i=1;i<=k;i++){
		for(ll j=1;j<=k;j++){
			char c;
			cin>>c;
			if(c=='0') s[i][j]=0;
			else s[i][j]=1;
		}
	}
//	for(ll i=1;i<=n;i++){
//		if(!dfn[i]) {
//			dfs(i,0);
//		}
//	}
	memset(dis,0x3f,sizeof(dis));
	priority_queue<pair<ll,ll> >q;
//	q.push(make_pair(0,scc[1]));
//	dis[scc[1]]=0;
	q.push(make_pair(0,1));
	dis[1]=0;
	while(!q.empty()) {
		ll u=q.top().second;
		q.pop();
		for(ll i=1;i<=n;i++){
			if(!s[b[u]][b[i]]) continue;
			if(dis[u]+abs(u-i)<dis[i]){
				dis[i]=dis[u]+abs(u-i);
				q.push(make_pair(-dis[i],i));
			}
		}
//		for(ll i=1;i<=scnt;i++){
//			if(dis[u]+dc(u,i)<dis[i]){
//				dis[i]=dis[u]+dc(u,i);
//				q.push(make_pair(-dis[i],i));
//			}
//		}
	}
//	cout<<dis[scc[n]];
	if(dis[n]>=0x3f3f3f3f) cout<<-1;
	else cout<<dis[n];
	return 0;
}