【Springboot毕设全套源码+文档】基于SpringBoot的药店管理系统设计与实现(丰富项目+远程调试+讲解+定制)
2026/7/9 13:48:40
本题要求计算在一个由单向街道组成的城市中,从每个交叉路口到另一个交叉路口的不同路径数量。交叉路口用非负整数标识,单向街道由一对整数j jjk kk表示,代表从j jj到k kk的单向街道。若两个交叉路口之间存在无穷多条路径(即存在环路),则输出− 1 -1−1。输入包含多个城市的数据,每个城市以街道数量开始,随后是若干对整数表示街道。每个城市的交叉路口编号从0 00到最大编号。要求输出一个矩阵,其中M [ j ] [ k ] M[j][k]M[j][k]表示从j jj到k kk的路径数,若无穷多则输出− 1 -1−1。
本题本质上是求有向图中任意两点间的路径数量,并处理存在环路导致路径数无穷的情况。由于交叉路口数量不超过30 3030,可以使用Floyd-Warshall \texttt{Floyd-Warshall}Floyd-Warshall算法的变种来解决。
关键点在于:
Floyd-Warshall \texttt{Floyd-Warshall}Floyd-Warshall算法的时间复杂度为O ( n 3 ) O(n^3)O(n3),其中n ≤ 30 n \leq 30n≤30,因此完全可以在规定时间内完成。
// Numbering Paths// UVa ID: 125// Verdict: Accepted// Submission Date: 2015-11-27// UVa Run Time: 0.000s//// 版权所有(C)2015,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;#defineMAXV31intmatrix[MAXV][MAXV];intlargest;voidfloyd(){for(intk=0;k<=largest;k++)for(inti=0;i<=largest;i++)for(intj=0;j<=largest;j++)matrix[i][j]+=matrix[i][k]*matrix[k][j];for(intk=0;k<=largest;k++)if(matrix[k][k])for(inti=0;i<=largest;i++)for(intj=0;j<=largest;j++)if(matrix[i][k]&&matrix[k][j])matrix[i][j]=-1;}intmain(intac,char*av[]){intintersections;intcases=0;intstart,end;while(cin>>intersections){largest=0;memset(matrix,0,sizeof(matrix));for(inti=1;i<=intersections;i++){cin>>start>>end;matrix[start][end]=1;largest=max(largest,max(start,end));}floyd();cout<<"matrix for city "<<cases++<<endl;for(inti=0;i<=largest;i++){cout<<matrix[i][0];for(intj=1;j<=largest;j++)cout<<" "<<matrix[i][j];cout<<endl;}}return0;}本题通过Floyd-Warshall \texttt{Floyd-Warshall}Floyd-Warshall算法的变种,巧妙地解决了有向图中路径计数的问题,并处理了环路导致的无穷路径情况。代码简洁高效,适合作为图论中路径计数问题的经典例题。