|
沙发
楼主 |
发表于 2021-3-21 18:04:08
|
只看该作者
这个题做的好的话很考人的建图能力,这题本质的做法就是求1-2,1-3,1-4,***1-n和2-1,3-1,4-1,***n-1等所有最短路径的和。要求这么多的最短经,一个比较简洁的方法就是floyd。我们先用floyd方法做一个试试。
floyd有个模型的理解是矩阵乘法,是我们在用floyd方法时候一般也用领接矩阵来存放图,读入邻接矩阵可不是个简单的事,若是无脑的读入u,v,w然后a(u)(v)=w,极有可能在重复读入的时候出现问题你看样例里面就有两次3 5 6 ,所以应该这样读:
- void readmap()
- {
- int x,y,z;
- cin>>n>>m;
- /// 没有的边变成inf !!!!
- for (int i=1; i<=n; i++)
- for (int j=1; j<=n; j++) a[i][j]=inf;
- while (m--)
- {
- cin>>x>>y>>z;
- if (a[x][y]>z)a[x][y]=z;// 这里注意怕 x y有重复
- }
- }
复制代码
读入图后下面的floyd就不难了。
- void floyd()
- {
- int i,j,k;
- for (i=1; i<=n; i++)
- for (j=1; j<=n; j++) d[i][j]=a[i][j];
- for (k=1; k<=n; k++)
- for (i=1; i<=n; i++)
- for (j=1; j<=n; j++)
- if (d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j];
- }
复制代码
交到luogu过了5个点,另外5个TLE,意料之中。因为这里面有了太多的重复计算,那么我们采用单源最短路径如何呢?
我以前写过一个dijistra的最短路径,若是无脑套用,效果不太好。主要原因在 |
|