图论基础整理

来源:互联网 发布:淘宝商城包 编辑:程序博客网 时间:2024/06/05 20:29

写在最前面:这是一篇很水很水的水博客,如果不无聊的同学就不要点进来了哈。我只是想记录一下今天复习的基础。

1.POJ1125、POJ3615

这两题都是非常水的floyd。

前一题是求图上一节点,使得它到所有点的最大距离最小。

显然只要floyd求所有点之间的最短路,然后枚举所有节点作为答案是否成立即可。

后一题是更水的多源最短路,初学floyd的同学都能轻松水过。

2.HDU2544、HDU1874、HDU2066

这三题都是非常水的最短路径问题,不过我对于dijstra还是比较生疏的(因为平时不太用到,我一般都用SPFA),堆优化的dijstra就更不用说了。

不过今天听说SPFA不如dijstra那么稳定,可能会出现一些奇奇怪怪的错误,所以我还是去复习了一发dijstra加堆优化。

在这里贴一下HDU2544的dijstra加堆优化的代码吧。

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#define N 110using namespace std;struct note{int d,w;bool operator < (const note lyf) const {return w>lyf.w;}};struct side{int to,w,nt;}s[20010];priority_queue <note> que;int n,m,x,y,w,dis[N],num,h[N];bool b[N];inline void add(int x,int y,int w){s[++num]=(side){y,w,h[x]},h[x]=num;s[++num]=(side){x,w,h[y]},h[y]=num;}int main(void){while (scanf("%d%d",&n,&m),n+m){memset(s,0,sizeof s),memset(h,0,sizeof h),num=0;for (int i=1; i<=m; ++i) scanf("%d%d%d",&x,&y,&w),add(x,y,w);memset(dis,0x3f,sizeof dis),memset(b,0,sizeof b);dis[1]=0,que.push((note){1,dis[1]});while (!que.empty()){int p=que.top().d;que.pop();if (b[p]) continue;b[p]=1;for (int i=h[p]; i; i=s[i].nt)if (dis[s[i].to]>dis[p]+s[i].w) dis[s[i].to]=dis[p]+s[i].w,que.push((note){s[i].to,dis[s[i].to]});}printf("%d\n",dis[n]);}return 0;}
3.POJ1511

这题嘛,需要稍微想一下(也只是稍微),题目大意是求一号节点到其他所有节点的距离和其他所有节点到一号节点的距离。

因为题目给出的是有向边,我们只需要建一张反向图,在反向图中把题目给出的边全部反向,然后对正向图和反向图各跑一边SPFA,求一号节点在两张图中到其他所有点的距离和就行了。(话说这题和洛谷1821的解法不是一模一样的吗?)

4.POJ3083

这题嘛,就是深搜和广搜的结合体嘛,对于前两问用深搜解决,后一问用广搜解决。

5.POJ3660

传递闭包什么的是什么鬼?!我只知道这题只需要用floyd判断图的连通性,把题目给出的关系看成双向边,做一遍floyd,如果一个节点和其他所有节点都是联通的,那么这个节点的排名就是确定的,加一下答案。


以上,就是今天的所有内容。各位大佬不喜勿喷啊QWQ

原创粉丝点击