@Kaike

今天来浅谈一下图,听说自己写总结的人grade++,rp++。

像我这样可爱的人怎么能错过这个机会呢嘤嘤嘤。

毕竟图至少啃了15day++。

恩曾经的小弱渣从来都是仰望高端玩家虐图论

听说noip上一年考两道大图(つд⊂)而小弱渣还没学到

吓得本宝宝虎躯一震!!

恩废话不多说,来开正文。

 

2019/01/27:

时隔两年重新看这篇博客,又更新的好多东西,希望自己一直能不断进步把,而不是一直啃以前的东西QAQ

-------------------我是萌哒哒的分割线--------------------

刚开始先学图的储存。

 

  1. 邻接矩阵

邻接矩阵就是跟二维数组长得一毛(mu)一样奇奇怪怪的东xi

靠二进制画几何[图论]

 1 #include<iostream>
 2 using namespace std;
 3 int n,a[100][100];
 4 int main()
 5 {
 6     cin>>n;
 7     //直接给出邻接矩阵,直接读。
 8     for(int i=1;i<=n;i++)
 9         for(int j=1;j<=n;j++)
10             cin>>a[i][j];
11     //给出两个顶点和权值
12     for(int i=1;i<=n;i++)
13     {
14         int xx,yy,vv;
15         cin>>xx>>yy>>vv;
16         a[xx][yy]=vv;
17         //双向图时
18         a[yy][xx]=vv;
19     }
20     //给出每个顶点的临界点
21     for(int i=1;i<=n;i++)
22     {
23         int k;
24         cin>>k;
25         for(int j=1;j<=k;j++)
26         {
27             int x;
28             cin>>x;
29             a[i][x]=1;
30             a[x][i]=1;
31         }
32     }
33     return 0;
34 }
邻接矩阵

 

2.邻接表

第一次看这玩意的时候内心万般草泥马奔过。

这TM都是什么玩意

后来经过滑稽大师cdc柴大叔的指导下,莫名其妙知道了些什么

然而教材太过简单,时常还会有些错的

小弱渣花了一整节自习课照着书上画了一幅图,发现!原来!跟书上一毛(mu)一样。本宝宝不开心,哦是十分不开心。

这大概是这个样子的

 1 #include<iostream>
 2 using namespace std;
 3 int n;
 4 int link[10010],len=0;
 5 struct ha
 6 {
 7     int y,v,next;
 8 }e[10010];
 9 void insert(int xx,int yy,int vv)
10 {
11     e[++len].next=link[xx];
12     link[xx]=len;
13     e[len].y=yy;
14     e[len].v=vv;
15 }
16 int main()
17 {
18     cin>>n;
19     int xx,yy,vv;
20     for(int i=1;i<=n;i++)
21     {
22         cin>>xx>>yy>>vv;
23         insert(xx,yy,vv);
24         insert(yy,xx,vv);
25     }
26     return 0;
27 }
邻接表

如果出现重边!邻接矩阵必须判断!!

 

-----------------我是萌萌哒的分割线------------------

 

DFS:以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。

 1 #include<iostream>
 2 using namespace std;
 3 bool book[10010];//记录顶点是否被访问过
 4 int a[10010][10010],n,m;
 5 int inf=0x7fffffff;
 6 int sum=0;
 7 //邻接矩阵
 8 void dfs(int x)
 9 {
10     for(int i=1;i<=n;i++)
11         if(book[i]==0 && a[x][i])
12         {
13             book[i]=1;
14             dfs(i);
15         }
16 }
17 //邻接表
18 void dfs(int x)
19 {
20     for(int i=link[x];i;i=e[i].next)
21         if(book[e[i].y]==0)
22         {
23             book[e[i].y]=1;
24             dfs(e[i].y);
25         }
26 }
27 int main()
28 {
29     cin>>n;
30     //初始化
31     for(int i=1;i<=n;i++)
32         for(int j=1;j<=n;j++)
33             if(i==j)    a[i][j]=0;
34             else    a[i][j]=inf;
35     int xx,yy,vv;
36     for(int i=1;i<=m;i++)
37     {
38         cin>>xx>>yy>>vv;
39         a[xx][yy]=vv;
40         a[yy][xx]=vv;
41     }
42     for(int i=1;i<=n;i++)
43         if(book[i]==0)
44         {
45             //求无向图的连接分量
46             sum++;
47             dfs(i);
48         }
49     return 0;
50 }
dfs

相关文章:

  • 2022-12-23
  • 2021-12-04
  • 2022-12-23
  • 2022-12-23
  • 2021-09-30
  • 2022-12-23
猜你喜欢
  • 2021-09-29
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-04
相关资源
相似解决方案