题面:
繁繁想和小伙伴们打游戏,游戏在一个山庄进行,这个山庄有N座山,编号为1到N,ji为了方便大家
在不同的山之间移动,繁繁建了一些桥,由于技术的原因,桥连接的两座山的高度差不能超过d,现
在已知这些桥,求这个山庄最高的山和最低的山差距最大是多少?如果差距可以为无穷大,输出-1。
输入格式:
第一个一个数T,表示测试数据数量(T<=5,2<=N<=50,0<=d<=1000)
每组数据第一行两个数N和d
接下来一个N行N列的矩阵,第i行j列为Y表示i和j之间建了一座桥,否则表示没有建
保证第i行j列和第j行i列值相同,并且第i行第i列值为N
输出格式:
T行,每行一个答案,若最大值可能为正无穷,输出-1
数据范围:
对于20%的数据,T<=3,N<=40
对于50%的数据,T<=3
对于100%的数据,T<=5,2<=N<=50,0<=d<=1000
题目大意:
给出一个无向图,有边两点间最大高度差为d,求高度差最大的两点。
思路:
求每两个点之间的最短路,找出最短路中最长的,在*d就可以了。
代码:
#includeusing namespace std; #define int long long int T,n,d,dfn[55][55],ans,flag,e[55][55]; void floyd() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(e[i][j]) dfn[i][j]=1; else { dfn[i][j]=100; } } dfn[i][i]=0; }//初值 for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { dfn[i][j]=min(dfn[i][j],dfn[i][k]+dfn[k][j]); } } }//floyd for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { ans=max(ans,dfn[i][j]); } }//统计答案 } signed main() { cin>>T; while(T--) { cin>>n>>d; memset(e,0,sizeof(e));//我是不会说我因为忘打这行而调了半天的...... flag=0,ans=0; for(int i=1;i<=n;i++) { string x; cin>>x; for(int j=0;j =100) cout<<-1< 是的,这是一道大水题。写这篇题解就是为了祭这次出的奇奇怪怪的锅(比如floyd循环套反了,不同组数据忘刷新数组)
(蒟蒻求点赞支持qwq)



