P7646 [COCI 2012/2013 #5] HIPERCIJEVI题解
P7646 [COCI 2012/2013 #5] HIPERCIJEVI
题目描述
在遥远的星系中,最快的运输方式是超级管道,它们将 K K K 个站台连接在一起。从站台 1 1 1 到达站台 N N N 最少需要经过多少个站台?
输入格式
第一行,三个整数 N , K , M N,K,M N,K,M,分别表示站台数,每根超级管道连接的站台数和超级管道数。
接下来 M M M 行,每行 K K K 个正整数,表示这跟超级管道连接的站台编号。
输出格式
一行,一个正整数,表示最少需要经过的站台数,如果到达不了站台
N
N
N ,则输出 -1。
输入输出样例 #1
输入 #1
9 3 5
1 2 3
1 4 5
3 6 7
5 6 7
6 8 9
输出 #1
4
输入输出样例 #2
输入 #2
15 8 4
11 12 8 14 13 6 10 7
1 5 8 12 13 6 2 4
10 15 4 5 9 8 14 12
11 12 14 3 5 6 1 13
输出 #2
3
说明/提示
【样例解释#1】
有两种方法从站台 1 1 1 走到站台 9 9 9:
1 ⇒ 3 ⇒ 6 ⇒ 9 1\Rightarrow 3\Rightarrow 6\Rightarrow 9 1⇒3⇒6⇒9 或 1 ⇒ 5 ⇒ 6 ⇒ 9 1\Rightarrow 5\Rightarrow 6\Rightarrow 9 1⇒5⇒6⇒9
共经过了 4 4 4 个站台,可以证明这是经过站台最少的情况。
【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 10 5 1\le N\le 10^5 1≤N≤105, 1 ≤ K , M ≤ 1000 1\le K,M\le 1000 1≤K,M≤1000。
【说明】
本题分值按 COCI 原题设置,满分 120 120 120。
题目译自 COCI2012~2013 CONTEST#5 T4 HIPERCIJEVI。
思路
将每个超级管道当成点即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
int n,k,m,a[1005][1005],f[105005],g[1005][1005],op=1e9+7;
vector<int> v[105005];
queue<int> q;
int main(){
cin>>n>>k>>m;
for(int o=1;o<=m;o++){
for(int i=1;i<=k;i++){
cin>>a[o][i];
v[a[o][i]].push_back(o);
if(a[o][i]==1){
q.push(o);
}
}
}
memset(f,62,sizeof(f));
for(int i=1;i<=n;i++){
for(int j=0;j<v[i].size();j++){
for(int k=0;k<v[i].size();k++){
g[v[i][j]][v[i][k]]=1;
}
if(i==1){
f[v[i][j]]=1;
}
}
}
while(q.size()!=0){
int u=q.front();
q.pop();
for(int i=1;i<=m;i++){
if(g[u][i]==1){
if(f[i]>=f[u]+1+1){
f[i]=f[u]+1;
q.push(i);
}
}
}
}
for(int i=0;i<v[n].size();i++){
op=min(op,f[v[n][i]]);
}
if(op>=1e9){
cout<<-1<<endl;
return 0;
}
cout<<op+1<<endl;
return 0;
}

浙公网安备 33010602011771号