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