当前位置: 首页 > wzjs >正文

云服务器网站建设常州seo排名收费

云服务器网站建设,常州seo排名收费,天元建设集团有限公司公章图片,深圳企业网站建设费用明细今天进入图论的学习。图论只考察初试学过的算法,一般都是模版题。常见考点有图相关的数据结构——邻接表法,图的遍历 BFS DFS 并查集,单源最短路径迪杰斯特拉。图由顶点和边构成,度用来说明该顶点邻接边的数量情况。权值说明了边的…

今天进入图论的学习。图论只考察初试学过的算法,一般都是模版题。常见考点有图相关的数据结构——邻接表法,图的遍历 BFS DFS 并查集,单源最短路径迪杰斯特拉。图由顶点和边构成,度用来说明该顶点邻接边的数量情况。权值说明了边的长度情况。邻接表法使用动态数组模拟链表。下面是最简单的一个邻接表。

#include <stdio.h>
#include <vector>
using namespace std;
// A-B A-C A-D C-D
int main(){//A-0 B-1 C-2 D-3vector<int> graph[4];int u, v;u=0, v=1;graph[u].push_back(v);graph[v].push_back(u);u=0, v=2;graph[u].push_back(v);graph[v].push_back(u);u=0, v=3;graph[u].push_back(v);graph[v].push_back(u);u=2, v=3;graph[u].push_back(v);graph[v].push_back(u);}

对于不相交的集合,做find,根据元素找到所在的集合,Union对多个集合进行合并。用树管理每一个集合。Find(x,y),x找到祖先,y找到祖先判断祖先是否相同。Union将一棵树加入另一棵树作为子树。树的构建容易变成一个链表,采取压缩路径的方法,下面是一个简单的并查集。

#include <stdio.h>
#include <vector>
using namespace std;
int father[1000];
//i 数组下标是集合数据编号 father[i]保存集合数据父亲的编号
//根i father[i] = i
void InitDisjointset(int n){//0~n-1for(int i = 0; i<n;i++){father[i] = i;}
}
int FindDisjointSet(int u){if(u == father[u]) return u;else {father[u] = FindDisjointSet(father[u]);return father[u];//路径压缩}
}
void UnionDisjointSet(int u, int v){int uroot = FindDisjointSet(u);int vroot = FindDisjointSet(v);father[vroot] = uroot;
}
int main(){//1 2 3 4 //5 6 7//0 8 int n = 9;InitDisjointset(n);UnionDisjointSet(1, 2);UnionDisjointSet(1, 3);UnionDisjointSet(1, 4);UnionDisjointSet(5, 6);UnionDisjointSet(5, 7);UnionDisjointSet(0, 8);for(int i = 0; i < 8;i++){printf("%d", father[i]);}
}

第一题是畅通工程。拿下。

#include <stdio.h>
#include <vector>
using namespace std;
int father[1000];
int Find(int u) {if (u == father[u]) return u;else {father[u] = Find(father[u]);return father[u];}
}
void Union(int u, int v) { //下标大的合并到下标小的int uroot = Find(u);int vroot = Find(v);father[vroot] = uroot;
}
int main() {int N, M;while (scanf("%d%d", &N, &M) != EOF) {//城镇从1到N M条路if (N == 0) break;for (int i = 1; i <= N; i++) {father[i] = i;}//初试化并查集for (int i = 0; i < M; i++) {int u, v;scanf("%d%d", &u, &v);if (u < v) {Union(u, v);} else Union(v, u);}int res = 0;for (int i = 1; i <= (N); i++) {if (father[i] == i) res++;}printf("%d\n", res - 1);}
}

第二题是这是一棵树吗。首先树不存在入度大于2的节点,已连通的uv不应当有新边在加入,同时输入完成后应当是一个连通图,边数 = 顶点数减1。挺复杂的一道题。

#include <stdio.h>
#include <vector>
using namespace std;
int father[10001];
int Find(int u){if(u == father[u]) return u;else {father[u] = Find(father[u]);return father[u];}
}
void Union(int u, int v){int uroot = Find(u);int vroot = Find(v);father[vroot] = uroot;
}
void Initset(int n ){for(int i = 0; i<n;i++){father[i] = i;}
}
int main(){int u, v;Initset(10001);int casenum = 1;int edgeCount = 0;int vertexCount = 0;vector<int> vertex(10001);//vertex[i] = 0说明i没出现过vector<int> indegree(10001);//记录i号节点入度bool istree = true;while(1){scanf("%d%d", &u, &v);if(u == -1&& v==-1) break;else if(u == 0&& v == 0){//一个图已经记录好了if(vertexCount != edgeCount+1){istree = false;//有特例,空树}if(vertexCount == 0&&edgeCount == 0) istree = true;if(istree == true){printf("Case %d is a tree.\n", casenum);}else printf("Case %d is not a tree.\n", casenum);//重置casenum++;Initset(10001);edgeCount = 0;vertexCount = 0;for(int i = 0; i<10001;i++){vertex[i] = 0;indegree[i] = 0;}istree = true;}else{//往当前图里加入新边edgeCount++;if(vertex[u] == 0){vertex[u] = 1;vertexCount++;}if(vertex[v] == 0){vertex[v] = 1;vertexCount++;}if(Find(u) == Find(v)){//判断是否成环istree = false;}else Union(u, v);indegree[v]++;if(indegree[v]>1) istree=false;}}
}

第三题是连通图​​​​​​​。

#include <stdio.h>
using namespace std;
int father[1001];
int find(int u) {if (u == father[u]) return u;else {father[u] = find(father[u]);return father[u];}
}
void Union(int u, int v) {int uroot = find(u);int vroot = find(v);father[vroot] = uroot;
}
int main() {int n, m;while (scanf("%d%d", &n, &m) != EOF) {if (n == 0) break;for (int i = 1; i <= n; i++) {father[i] = i;}for (int i = 0; i < m; i++) {int u, v;scanf("%d%d", &u, &v);Union(u, v);}int res = 0;for (int i = 1; i <= n; i++) {if (i == father[i]) res++;}if (res > 1) printf("NO\n");else  printf("YES\n");}
}

第四题是第一题。好奇怪的名字。第一次没有使用大树合并小数,导致产生了段错误。

#include <stdio.h>
using namespace std;
int father[1000];
int visited[1000];
int find(int u){if(u == father[u]) return u;else{father[u] = find(father[u]);return father[u];}
}
void Union(int u, int v){int uroot = find(u);int vroot = find(v);father[vroot] = uroot;
}
int main(){for(int i = 0;i<1000;i++){father[i] = i;visited[i] = 0;}int u,v;while(scanf("%d%d", &u, &v)!=EOF){Union(u, v);visited[u] = 1;visited[v] = 1;}int res = 0;for(int i =0;i<1000;i++){if(i == father[i]&&visited[i]==1) res++;}printf("%d", res);
}

结果发现单纯数组开小了,难绷。

#include <stdio.h>
using namespace std;
const int maxN = 1e6;
int father[maxN];
int visited[maxN];
int find(int u){if(u == father[u]) return u;else{father[u] = find(father[u]);return father[u];}
}
void Union(int u, int v){int uroot = find(u);int vroot = find(v);father[vroot] = uroot;
}
int main(){for(int i = 0;i<maxN;i++){father[i] = i;visited[i] = 0;}int u,v;while(scanf("%d%d", &u, &v)!=EOF){Union(u, v);visited[u] = 1;visited[v] = 1;}int res = 0;for(int i =0;i<maxN;i++){if(i == father[i]&&visited[i]==1) res++;}printf("%d", res);
}

第五题是找出直系亲属。不太会写。拼尽全力无法战胜。

 #include <iostream>#include <cstdio>using namespace std;const int MAXN = 30;int children[MAXN];int Generation(int x, int y) {int level;level = 0;int a = x;while (children[a] != a) {a = children[a];level++;if (a == y) {return level;}}level = 0;int b = y;while (children[b] != b) {b = children[b];level--;if (b == x) {return level;}}return 0;}string Relationship(int level) {string answer;if (level == 0) {answer = "-";} else if (level == 1) {answer = "parent";} else if (level == 2) {answer = "grandparent";} else if (level > 2) {for (int j = 0; j < level - 2; ++j) {answer += "great-";}answer += "grandparent";} else if (level == -1) {answer = "child";} else if (level == -2) {answer = "grandchild";} else if (level < -2) {for (int j = 0; j < -2 - level; ++j) {answer += "great-";}answer += "grandchild";}return answer;}int main() {int n, m;while (scanf("%d%d", &n, &m) != EOF) {for (int i = 0; i < MAXN; ++i) {children[i] = i;}for (int i = 0; i < n; ++i) {char child, father, mother;cin >> child >> father >> mother;if (father - 'A' != '-') {children[father - 'A'] = child - 'A';}if (mother - 'A' != '-') {children[mother - 'A'] = child - 'A';}}for (int i = 0; i < m; ++i) {char guy1, guy2;cin >> guy1 >> guy2;int level = Generation(guy1 - 'A', guy2 - 'A');cout << Relationship(level) << endl;}}return 0;}

http://www.dtcms.com/wzjs/355974.html

相关文章:

  • 站长工具麻豆看广告赚钱的平台
  • 2003系统网站建设手机网站制作软件
  • 网站设计制作 厂关键字查找
  • 新钥匙石家庄网站建设如何获取热搜关键词
  • 虚拟主机 视频网站网络销售挣钱吗
  • 微信营销的案例windows优化大师官方下载
  • 本地网站建设公司培训优化
  • 广州专业手机网站建设关键词竞价排名是什么意思
  • wordpress ks主题重庆二级站seo整站优化排名
  • 设计一个电子商务网站建设方案搜狗站长平台
  • 黄骅58同城最新招聘信息廊坊百度关键词优化怎么做
  • 大连公司地址宁波seo推广
  • 莆田交友网站公司微信5000人接推广费用
  • 著名建站公司西安百度公司开户
  • 动态网站建设方式如何优化培训方式
  • 如何利用互联网挣钱北京seo培训
  • 用别人备案域名做违法网站免费网站推广方式
  • 网站添加可信任站点怎么做乐陵seo优化
  • 网站建设次年续费合同微信营销方式有哪些
  • 大连开发区七中沈阳关键词seo排名
  • 做航模的网站灰色产业推广引流渠道
  • 山东百度推广总代理山西seo关键词优化软件搜索
  • 国外有哪些做建筑材料的网站nba中国官方网站
  • 网站建设wang1314广东网站seo策划
  • 苹果 在线视频网站源码广州做seo公司
  • 公司的帐如何做网站广州seo优化外包公司
  • 免费企业网站源码下载网络营销策划公司
  • 山东鑫企点外贸订单靠谱吗网站关键词优化排名技巧
  • 这么做国外网站的国内镜像站ping站长工具
  • 宁夏做网站建设公司武汉网站设计