题目描述
明明同学被困在一个荒凉的北极岛屿,他可以用小船乘着海流用1单位时间从一个岛移动到另一个岛。他得到了一个海洋地图,有N(1<=N<=100)条单向海流航线,编号为1..N。
告诉你他的起始位置M(1<=M<=N)和地图,请编程帮助明明确定到达每个岛的最短时间是多少。
输入为一个矩阵C,第r行,第c列的值若为1,则r到c存在海流,值为0则不存在海流。
告诉你他的起始位置M(1<=M<=N)和地图,请编程帮助明明确定到达每个岛的最短时间是多少。
输入为一个矩阵C,第r行,第c列的值若为1,则r到c存在海流,值为0则不存在海流。
输入
第1行:两个用空格隔开的整数:N和M
第2..N+1:第i+1行包含N个用空格隔开的整数:C_R
第2..N+1:第i+1行包含N个用空格隔开的整数:C_R
输出
第1..??行:第一行输出M,第i+1行包含时刻i能到达的岛屿(升序排列)
样例输入 Copy
4 1
0 1 0 1
0 0 1 0
0 0 0 1
0 0 0 0
样例输出 Copy
1
2 4
3
这个题可以用最短路也可以用模拟:
模拟大法:
#include<bits/stdc++.h> #include <math.h> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int maxn=110; const int inf=0x3fffffff; int a[maxn][maxn]; int k[maxn]; int p[maxn]; int n,m; void inint(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; } } } int main(){ inint(); int ans=1; printf("%d\n",m); k[m]=1; for(int i=1;i<=n;i++){ if(a[m][i]==1){ printf("%d ",i); ans++; k[i]=1; } } printf("\n"); int z=2,o=0; int pp=0; while(1){ pp++; o=0; for(int i=1;i<=n;i++){ if(i==m){ continue; } if(k[i]==(z-1)){ for(int j=1;j<=n;j++){ if(k[j]==0&&a[i][j]==1){ p[o++]=j; k[j]=z; ans++; } } } } sort(p,p+o); for(int i=0;i<o;i++){ if(k[p[i]]==z) printf("%d ",p[i]); } z++; if(ans==n||pp>=100){ break; } printf("\n"); } }