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

上海企业信用网查询杭州seo哪家好

上海企业信用网查询,杭州seo哪家好,网站首页改版费用,嘉兴app开发今天进入图论的学习。图论只考察初试学过的算法,一般都是模版题。常见考点有图相关的数据结构——邻接表法,图的遍历 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/421644.html

相关文章:

  • 龙岩永定疫情seo长尾快速排名
  • 网站内容资源建设aso优化{ }贴吧
  • 如何做网站平台关注专业网站优化
  • 营销型网站的三大特点地推团队接单平台
  • 棋牌app开发价格表优化大师专业版
  • WordPress可以用Java吗免费关键词排名优化软件
  • txt怎么做网站销售技巧和话术
  • 深圳外贸网站建设工作室100大看免费行情的软件
  • 网站怎么做反爬虫厦门网站流量优化价格
  • 电子商务网站栏目刷僵尸粉网站推广
  • 怎么做学校官方网站爱网站
  • jsp做网站 案例滁州网站seo
  • 没有营业执照网站备案网络推广怎么样
  • 平面设计国外网站许昌网络推广公司
  • 公司网站建设要多少钱近期重大新闻
  • 微商城开发用华网天下北京想做seo哪里有培训的
  • 悟空建站是什么百度教育app
  • 网站模板源码下载营销策略方案
  • 贵阳网站建设 设计可以吗百度指数功能有哪些
  • 工程管理毕业设计代做网站网络产品及其推广方法
  • 红色色系网站厦门关键词seo排名网站
  • 绍兴网站建设方案书国外域名购买
  • 滚动网站模版低价刷粉网站推广
  • 购物网站建设代理商网站开发的步骤
  • 搭建网站是要什么关键词优化排名用什么软件比较好
  • 青海网站推广策划方案seo网站推广计划
  • wordpress 國内加速搜索引擎优化实训心得
  • 网站图片设置隐私保护怎么下载我为什么不建议年轻人做运营
  • o2o商城上海优化网站方法
  • 做时时彩网站什么是搜索推广