问题 B: 寻路

问题 B: 寻路

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

明明同学被困在一个荒凉的北极岛屿,他可以用小船乘着海流用1单位时间从一个岛移动到另一个岛。他得到了一个海洋地图,有N(1<=N<=100)条单向海流航线,编号为1..N。
告诉你他的起始位置M(1<=M<=N)和地图,请编程帮助明明确定到达每个岛的最短时间是多少。
输入为一个矩阵C,第r行,第c列的值若为1,则r到c存在海流,值为0则不存在海流。

输入

第1行:两个用空格隔开的整数:N和M
第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");
    }
} 
 

猜你喜欢

转载自www.cnblogs.com/lipu123/p/12764412.html
今日推荐