B - Anna, Svyatoslav and Maps

  题目:

 

 

 

题目网址:Problem - C - Codeforces

  思路:

输入一个由0,1组成的图代表二维数组的道路有无;

在输入m给节点判断是否可以被去掉;

首先对数组进行初始化,在进行Floyd循环,

在对每一个节点进行判断

若w[cnt][res[i]] + w[re[i]] [res[i+1]] <w[cnt][res[i+1]],则第i个点肯定不能去掉;反之,可以去掉。

  代码实现:

#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int N=105;
const int INF=100000000;
int n,m,d[N][N],t,res[1000002],vis[1000002];
void Floyd(int src){//Floyd循环
    for(int k=1; k<=n; ++k){
        for(int i=1; i<=n; ++i){
            for(int j=1; j<=n; ++j)
                if(d[i][k]<INF && d[k][j]<INF){
                    d[i][j] = min(d[i][j], d[i][k]+d[k][j]);
                }
        }
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)//输入数据
        for(int j=1;j<=n;j++)
        {
            scanf("%1d",&t);//单个数据输入
            if(t==0)
                d[i][j]=INF;
            else
                d[i][j]=t;
            if(i==j)
                d[i][i]=0;
        }
    Floyd(1);
    cin>>m;
    for(int i=1;i<=m;i++)
        cin>>res[i];//记录输入节点
    int cnt = res[1];
    int t = m;
    for(int i = 2; i<=m - 1; ++i)//进行循环判断
    {
        if(d[cnt][res[i]] + d[res[i]][res[i+1]]<=d[cnt][res[i+1]]&&cnt != res[i+1])
            vis[i] = 1,t --;
        else
            cnt = res[i];
    }
    cout<<t<<endl;
    for(int i = 1; i<=m; ++i)//输出答案
        if(!vis[i])
            cout<<res[i]<<" ";
    return 0;
}

 

posted @ 2021-07-28 14:06  wateriness  阅读(44)  评论(0)    收藏  举报