int choose; std::cout << "请选择数据集(1、小数据, 2、大数据,3、随机图 ,else: 自行输入):\n"; std::cin >> choose; FILE* fp = nullptr; switch (choose) { case 1: fp = freopen(R"(C:\Users\28492\Desktop\szu\算法\Project5\mediumDG.txt)", "r", stdin); break; case 2: fp = freopen(R"(C:\Users\28492\Desktop\szu\算法\Project5\largeG.txt)", "r", stdin); break; default: cout << "请输入样例:" << endl; break; } cin >> n >> e; adj.clear(), adj.resize(n); int tag = 1; for (int i = 0; i < e; ++i) { int x, y; cin >> x >> y; if (x > y) swap(x, y); if (x == y) { continue; } if (cir_edges.count({ x, y })) continue; adj[x].emplace_back(y), adj[y].emplace_back(x); cout << tag; edges[tag++] = {x,y}; //order[x][y] = tag - 1; //标记每个边对应的下标 cir_edges.insert({ x, y }); }
时间: 2024-02-14 21:12:36 浏览: 235
这段代码是一个读取图数据的过程,根据用户选择的数据集,从相应的文件中读取图的节点数n和边数e,然后按照边的起点和终点构建邻接表,并且将边存储在一个vector中。其中,adj是邻接表,用vector实现;tag是一个整数变量,用于计数;edges是一个vector,用于存储边;cir_edges是一个set,用于存储已经出现过的边,避免出现重复边。
这段代码有几个需要注意的地方:
1. 文件路径
在使用freopen函数打开文件时,需要传入文件的路径。需要确保文件路径是正确的,否则会打开失败。
2. 输入格式
读取图数据时,需要按照固定的格式读入节点数n和边数e,然后按照边的起点和终点读入每条边。需要确保输入格式正确,否则会出现意想不到的错误。
3. 边的存储
这段代码使用了一个vector来存储图的边,可以根据需要对边进行排序、查找等操作。需要确保边的起点和终点的数据类型与vector中定义的一致,否则会出现类型不匹配的错误。
4. 重复边的处理
在读取图数据的过程中,可能会出现重复的边,需要进行处理。这段代码使用了一个set来存储已经出现过的边,避免出现重复边。
相关问题
#include<iostream> #include<stdio.h> #include<malloc.h> using namespace std;//声明命名空间 //链栈 typedef struct stacknode{ int data;//数据域 struct stacknode *next;//指针域 }stacknode,*LinkStack; //初始化栈,创建一个空栈 void initLinkStack(LinkStack &L){ L=NULL;//空链站 } //判断栈是否为空 int emptyLinkStack(LinkStack L){ if(L==NULL){ return 0; }else{ return 1; } } //入栈 void pushLinkStack(LinkStack &L,int e){ LinkStack p; p=(LinkStack)malloc(sizeof(stacknode)); p->data=e; p->next=L; L=p; } //出栈 void popLinkStack(LinkStack &L,int &e){ LinkStack p; p=L; e=L->data;//取出栈顶元素给e L=L->next; delete(p); } //十进制转2、8、16进制,采用除基倒取余法 void numberConversionL(int oNumber,int cvNumber){ LinkStack L; //创建栈 int x; initLinkStack(L); //初始化栈 while(oNumber){ x=oNumber%cvNumber; pushLinkStack(L,x);//余数入栈 oNumber=oNumber/cvNumber; } //余数出栈 while(emptyLinkStack(L)){ popLinkStack(L,x); switch(x){ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9:cout<<x; break; case 10:cout<<"A"; break; case 11:cout<<"B"; break; case 12:cout<<"C"; break; case 13:cout<<"D"; break; case 14:cout<<"E"; break; case 15:cout<<"F"; break; } } } //主函数 int main(){ int oNumber,cvNumber; int oNumberL,cvNumberL; int choose; cout<<"请选择所需功能\n1.使用链栈转换\n2.退出程序"; cout<<endl; //换行 cin>>choose; while(choose!=2){ switch(choose){ case 1:{ cout<<"请输入要转换的十进制数:"<<endl; cin>>oNumberL; cout<<"请输入要转换至的进制,仅限输入2、8以及16:"<<endl; cin>>cvNumberL; numberConversionL(oNumberL,cvNumberL); break; } default: cout<<"\n!!!您的选择不正确,请重新选择!!!\n"; } cout<<endl; //换行 cout<<"请选择所需功能\n1.使用链栈转换\n2.退出程序"; cout<<endl; //换行 cin>>choose; } return 0; }这段代码数制转换器的研究背景和意义
这段代码实现了一个数制转换器,可以将十进制数转换为二进制、八进制或十六进制。数制转换在计算机领域中非常重要,因为不同的进制可以用不同的位数来表示同一个数,而在计算机中,位数的变化会对数据的存储和处理方式产生影响。例如,在二进制中,每一位只能是0或1,而在十进制中,每一位可以是0-9中的任意一个数字。因此,当需要将不同进制的数据进行运算或比较时,需要将它们转换为相同的进制。此外,数制转换也是程序设计和计算机科学中的基础知识之一。
简单组合: 计算C(n,m)的值,C(n,m)代表从n个元素中选取m个元素的方法数,其中有1<= m <= n<= 65。 输入: 输入数据有多组,每组数据一行,有2个整数分别为n和m。 输出: 输出从总共n个元素中选出m个元素共有多少种方法? 使用c++代码实现
在C++中,你可以使用动态规划来计算组合数C(n, m),也称为“n choose m”。这里是一个简单的递推算法实现:
```cpp
#include <iostream>
using namespace std;
int C(int n, int m) {
if (m == 0 || m == n) {
// base cases: 当m=0或m=n时,组合数为1
return 1;
} else {
// 根据组合公式 C(n, m) = C(n-1, m-1) + C(n-1, m)
return C(n - 1, m - 1) + C(n - 1, m);
}
}
int main() {
int n, m;
while (cin >> n >> m) {
cout << "C(" << n << ", " << m << ") = " << C(n, m) << endl;
}
return 0;
}
```
这个程序首先检查基本情况(当m等于0或n),然后使用组合公式`C(n, m) = C(n-1, m-1) + C(n-1, m)`递归地计算组合数。
需要注意的是,这种方法对于较大的n和m可能会导致栈溢出,因为递归深度会很大。实际应用中,可以考虑使用更高效的算法,如“阶乘”和“组合恒等式”避免这种问题,但这超出了给定任务的简单组合范围。
阅读全文