@Kaike
今天来浅谈一下图,听说自己写总结的人grade++,rp++。
像我这样可爱的人怎么能错过这个机会呢嘤嘤嘤。
毕竟图至少啃了15day++。
恩曾经的小弱渣从来都是仰望高端玩家虐图论
听说noip上一年考两道大图(つд⊂)而小弱渣还没学到
吓得本宝宝虎躯一震!!
恩废话不多说,来开正文。
2019/01/27:
时隔两年重新看这篇博客,又更新的好多东西,希望自己一直能不断进步把,而不是一直啃以前的东西QAQ
-------------------我是萌哒哒的分割线--------------------
刚开始先学图的储存。
- 邻接矩阵
邻接矩阵就是跟二维数组长得一毛(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 }