B - Anna, Svyatoslav and Maps
题目:


思路:
输入一个由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; }

浙公网安备 33010602011771号