Courses

二分匹配匈牙利算法裸体

分析:p门课程,n名学生,要求每门课正好只有一名学生选修,且学生只能选一门课。最大匹配数=课程数p

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=505;
int line[N][N];
int girl[N],used[N];
int k,m,n;
bool found(int x)
{
    for(int i=1; i<=n; i++)
    {
        if(line[x][i]&&!used[i])
        {
            used[i]=1;
            if(girl[i]==0||found(girl[i]))
            {
                girl[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int t,p;
    int x,y;
    scanf("%d",&t);

    while(t--)
    {
        scanf("%d %d",&p,&n);
        memset(line,0,sizeof(line));
        memset(girl,0,sizeof(girl));
        for(int i=0; i<p; i++)
        {
            scanf("%d",&x);
            for(int j=1;j<=x;j++)
            {
                scanf("%d",&y);
                line[i+1][y]=1;
            }
        }
        int sum=0;
        for(int i=1; i<=n; i++)
        {
            memset(used,0,sizeof(used));
            if(found(i)) sum++;
        }
        if(sum==p)
        printf("YES\n");
        else
                printf("NO\n");
    }
    return 0;
}

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>//输入输出函数 #include <stdlib.h>//标准库函数 #define MAX_COURSES 100//设置最大课程数量 #define MAX_STUDENTS 100//设置最大学生数量 // 课程结构体 typedef struct { int id; char name[50]; char nature[20]; int total_hours; int teaching_hours; int experiment_hours; int credits; int semester;//仅支持输入数字,例如“1”代表“第一学期” int selected_count;//选择该课程人数 } Course; // 学生结构体 typedef struct { int id; char name[50]; int selected_courses[MAX_COURSES];// 已选课程的编号列表,可存储一百个课程编号 int course_count;// 已选课程数量 int total_credits;// 已选课程总学分 } Student; //计数器存储所有课程与学生数据 Course courses[MAX_COURSES];//存储所有课程的数组 int course_count = 0;//初始化课程数 Student students[MAX_STUDENTS];// 存储所有学生的数组 int student_count = 0;//初始化学生总数 // 菜单显示 void menu() { printf("\n学生选修课程系统\n"); printf("1. 录入课程信息\n"); printf("2. 录入学生信息\n"); printf("3. 浏览课程信息\n"); printf("4. 按课程性质查询课程\n"); printf("5. 按学分查询课程\n"); printf("6. 按课程编号查询课程\n"); printf("7. 查看某门课程学生选修情况\n"); printf("8. 退出\n"); printf("请输入你的选择: "); } // 录入课程信息 void input_course_info() { if (course_count >= MAX_COURSES) { printf("课程数量已达到上限!\n"); return; } Course new_course; char temp[9]; int valid; do { printf("请输入8位课程编号: "); scanf("%8s", temp); // 限制输入8字符 // 验证数字格式 valid = 1; for (int i = 0; i < 8; i++) { if (!isdigit(temp[i])) { printf("输入编号不足8位或包含非数字字符!\n"); valid = 0; break; } } if (valid) new_course.id = atoi(temp); } while (!valid); int id = new_course.id; printf("你输入的有效的课程编号是: %d\n", id); scanf("%*[^\n]");// 读取除换行符之外的所有字符 printf("请输入课程名称: "); scanf("%s", new_course.name); printf("请输入课程性质(必修课、选修课): "); scanf("%s", new_course.nature); do { printf("请输入总学时: "); scanf("%d", &new_course.total_hours); printf("请输入授课学时: "); scanf("%d", &new_course.teaching_hours); printf("请输入上机学时: "); scanf("%d", &new_course.experiment_hours); if (new_course.teaching_hours + new_course.experiment_hours != new_course.total_hours) { printf("授课学时与上机学时之和不等于总学时,请重新输入!\n"); } } while (new_course.teaching_hours + new_course.experiment_hours != new_course.total_hours); printf("请输入学分: "); scanf("%d", &new_course.credits); printf("请输入开课学期: "); scanf("%d", &new_course.semester);//仅支持输入数字,例如“1”代表“第一学期” new_course.selected_count = 0; courses[course_count++] = new_course;//存入数组后,更新自增 printf("课程信息录入成功!\n"); } // 录入学生信息 void input_student_info() { if (student_count >= MAX_STUDENTS) { printf("学生数量已达到上限!\n"); return; } Student new_student; printf("请输入学生编号: "); scanf("%d", &new_student.id); printf("请输入学生姓名: "); scanf("%s", new_student.name); new_student.course_count = 0; new_student.total_credits = 0; int choice; do { printf("请选择课程编号(输入 0 结束选课): "); scanf("%d", &choice); if (choice == 0) break; int found = 0; for (int i = 0; i < course_count; i++) { if (courses[i].id == choice) { found = 1; // 检查是否重复选课 int is_duplicate = 0; for (int j = 0; j < new_student.course_count; j++) { if (new_student.selected_courses[j] == choice) { is_duplicate = 1; printf("该课程已选,请重新选择!\n"); break; } } if (!is_duplicate) { new_student.selected_courses[new_student.course_count++] = choice; new_student.total_credits += courses[i].credits; courses[i].selected_count++; } break; } } if (found==0) { printf("未找到该课程编号,请重新输入!\n"); } } while (1);//保持真,无限循环 if (new_student.total_credits < 30) { printf("选课总学分少于 30,请继续选课!\n"); return; } students[student_count++] = new_student; printf("学生信息录入成功!\n"); } // 浏览课程信息 void browse_course_info() { printf("\n课程信息如下:\n"); printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n", "编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数"); for (int i = 0; i < course_count; i++) { printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n", courses[i].id, courses[i].name, courses[i].nature, courses[i].total_hours, courses[i].teaching_hours, courses[i].experiment_hours, courses[i].credits, courses[i].semester, courses[i].selected_count); } } // 按课程性质查询课程 void query_by_nature() { char nature[20]; printf("请输入课程性质(必修课、选修课): "); scanf("%s", nature); printf("\n符合条件的课程信息如下:\n"); printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n", "编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数"); for (int i = 0; i < course_count; i++) { if (strcmp(courses[i].nature, nature) == 0) {//判断性质是否一致 printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n", courses[i].id, courses[i].name, courses[i].nature, courses[i].total_hours, courses[i].teaching_hours, courses[i].experiment_hours, courses[i].credits, courses[i].semester, courses[i].selected_count); } } } // 按学分查询课程 void query_by_credits() { int credits; printf("请输入学分: "); scanf("%d", &credits); printf("\n符合条件的课程信息如下:\n"); printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n", "编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数"); for (int i = 0; i < course_count; i++) { if (courses[i].credits == credits) {//判断学分是否一致 printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n", courses[i].id, courses[i].name, courses[i].nature, courses[i].total_hours, courses[i].teaching_hours, courses[i].experiment_hours, courses[i].credits, courses[i].semester, courses[i].selected_count); } } } // 按课程编号查询课程 void query_by_id() { int id; printf("请输入课程编号: "); scanf("%d", &id); for (int i = 0; i < course_count; i++) { if (courses[i].id == id) { printf("\n符合条件的课程信息如下:\n"); printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n", "编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数"); printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n", courses[i].id, courses[i].name, courses[i].nature, courses[i].total_hours, courses[i].teaching_hours, courses[i].experiment_hours, courses[i].credits, courses[i].semester, courses[i].selected_count); return; } } printf("未找到该课程编号!\n"); } // 查看某门课程学生选修情况 void view_course_selection() { int id; printf("请输入课程编号: "); scanf("%d", &id); int found = 0; for (int i = 0; i < course_count; i++) { if (courses[i].id == id) { found = 1; printf("课程 %s 的选修学生信息如下:\n", courses[i].name); printf("%-12s %-15s\n", "学生编号", "学生姓名"); for (int j = 0; j < student_count; j++) {//遍历学生数组 for (int k = 0; k < students[j].course_count; k++) {//遍历该学生选课数组 if (students[j].selected_courses[k] == id) { printf("%-12d %-15s\n", students[j].id, students[j].name); break; } } } break; } } if (found==0) { printf("未找到该课程编号!\n"); } } //主函数main int main() { int choice; do { menu();//显示菜单 scanf("%d", &choice); switch (choice) {//根据选择执行对应函数 case 1: input_course_info(); break; case 2: input_student_info(); break; case 3: browse_course_info(); break; case 4: query_by_nature(); break; case 5: query_by_credits(); break; case 6: query_by_id(); break; case 7: view_course_selection(); break; case 8: printf("退出系统!\n"); break; default: printf("无效的选择,请重新输入!\n"); } } while (choice != 8); return 0; }学生第一次选课
最新发布
09-20
要在 C 语言编写的学生选修课程系统中解决学生第一次选课的重复选课问题,需要在学生选课逻辑里添加检查机制,以此保证同一学生不会重复选择同一门课程。以下是修改后的代码: ```c #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_COURSES 100 #define MAX_STUDENTS 100 // 课程结构体 typedef struct { int id; char name[50]; char nature[20]; int total_hours; int teaching_hours; int experiment_hours; int credits; int semester; int selected_count; } Course; // 学生结构体 typedef struct { int id; char name[50]; int selected_courses[MAX_COURSES]; int course_count; int total_credits; } Student; // 计数器存储所有课程与学生数据 Course courses[MAX_COURSES]; int course_count = 0; Student students[MAX_STUDENTS]; int student_count = 0; // 菜单显示 void menu() { printf("\n学生选修课程系统\n"); printf("1. 录入课程信息\n"); printf("2. 录入学生信息\n"); printf("3. 浏览课程信息\n"); printf("4. 按课程性质查询课程\n"); printf("5. 按学分查询课程\n"); printf("6. 按课程编号查询课程\n"); printf("7. 查看某门课程学生选修情况\n"); printf("8. 退出\n"); printf("请输入你的选择: "); } // 录入课程信息 void input_course_info() { if (course_count >= MAX_COURSES) { printf("课程数量已达到上限!\n"); return; } Course new_course; char temp[9]; int valid; do { printf("请输入8位课程编号: "); scanf("%8s", temp); valid = 1; for (int i = 0; i < 8; i++) { if (!isdigit(temp[i])) { printf("输入编号不足8位或包含非数字字符!\n"); valid = 0; break; } } if (valid) new_course.id = atoi(temp); } while (!valid); int id = new_course.id; printf("你输入的有效的课程编号是: %d\n", id); scanf("%*[^\n]"); printf("请输入课程名称: "); scanf("%s", new_course.name); printf("请输入课程性质(必修课、选修课): "); scanf("%s", new_course.nature); do { printf("请输入总学时: "); scanf("%d", &new_course.total_hours); printf("请输入授课学时: "); scanf("%d", &new_course.teaching_hours); printf("请输入上机学时: "); scanf("%d", &new_course.experiment_hours); if (new_course.teaching_hours + new_course.experiment_hours != new_course.total_hours) { printf("授课学时与上机学时之和不等于总学时,请重新输入!\n"); } } while (new_course.teaching_hours + new_course.experiment_hours != new_course.total_hours); printf("请输入学分: "); scanf("%d", &new_course.credits); printf("请输入开课学期: "); scanf("%d", &new_course.semester); new_course.selected_count = 0; courses[course_count++] = new_course; printf("课程信息录入成功!\n"); } // 录入学生信息 void input_student_info() { if (student_count >= MAX_STUDENTS) { printf("学生数量已达到上限!\n"); return; } Student new_student; printf("请输入学生编号: "); scanf("%d", &new_student.id); printf("请输入学生姓名: "); scanf("%s", new_student.name); new_student.course_count = 0; new_student.total_credits = 0; int choice; do { printf("请选择课程编号(输入 0 结束选课): "); scanf("%d", &choice); if (choice == 0) break; int found = 0; for (int i = 0; i < course_count; i++) { if (courses[i].id == choice) { found = 1; // 检查是否重复选课 int is_duplicate = 0; for (int j = 0; j < new_student.course_count; j++) { if (new_student.selected_courses[j] == choice) { is_duplicate = 1; printf("该课程已选,请重新选择!\n"); break; } } if (!is_duplicate) { new_student.selected_courses[new_student.course_count++] = choice; new_student.total_credits += courses[i].credits; courses[i].selected_count++; } break; } } if (found == 0) { printf("未找到该课程编号,请重新输入!\n"); } } while (1); if (new_student.total_credits < 30) { printf("选课总学分少于 30,请继续选课!\n"); return; } students[student_count++] = new_student; printf("学生信息录入成功!\n"); } // 浏览课程信息 void browse_course_info() { printf("\n课程信息如下:\n"); printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n", "编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数"); for (int i = 0; i < course_count; i++) { printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n", courses[i].id, courses[i].name, courses[i].nature, courses[i].total_hours, courses[i].teaching_hours, courses[i].experiment_hours, courses[i].credits, courses[i].semester, courses[i].selected_count); } } // 按课程性质查询课程 void query_by_nature() { char nature[20]; printf("请输入课程性质(必修课、选修课): "); scanf("%s", nature); printf("\n符合条件的课程信息如下:\n"); printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n", "编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数"); for (int i = 0; i < course_count; i++) { if (strcmp(courses[i].nature, nature) == 0) { printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n", courses[i].id, courses[i].name, courses[i].nature, courses[i].total_hours, courses[i].teaching_hours, courses[i].experiment_hours, courses[i].credits, courses[i].semester, courses[i].selected_count); } } } // 按学分查询课程 void query_by_credits() { int credits; printf("请输入学分: "); scanf("%d", &credits); printf("\n符合条件的课程信息如下:\n"); printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n", "编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数"); for (int i = 0; i < course_count; i++) { if (courses[i].credits == credits) { printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n", courses[i].id, courses[i].name, courses[i].nature, courses[i].total_hours, courses[i].teaching_hours, courses[i].experiment_hours, courses[i].credits, courses[i].semester, courses[i].selected_count); } } } // 按课程编号查询课程 void query_by_id() { int id; printf("请输入课程编号: "); scanf("%d", &id); for (int i = 0; i < course_count; i++) { if (courses[i].id == id) { printf("\n符合条件的课程信息如下:\n"); printf("%-10s %-15s %-10s %-8s %-10s %-10s %-6s %-8s %-8s\n", "编号", "名称", "性质", "总学时", "授课学时", "实验学时", "学分", "开课学期", "选修人数"); printf("%-10d %-15s %-10s %-8d %-10d %-10d %-6d %-8d %-8d\n", courses[i].id, courses[i].name, courses[i].nature, courses[i].total_hours, courses[i].teaching_hours, courses[i].experiment_hours, courses[i].credits, courses[i].semester, courses[i].selected_count); return; } } printf("未找到该课程编号!\n"); } // 查看某门课程学生选修情况 void view_course_selection() { int id; printf("请输入课程编号: "); scanf("%d", &id); int found = 0; for (int i = 0; i < course_count; i++) { if (courses[i].id == id) { found = 1; printf("课程 %s 的选修学生信息如下:\n", courses[i].name); printf("%-12s %-15s\n", "学生编号", "学生姓名"); for (int j = 0; j < student_count; j++) { for (int k = 0; k < students[j].course_count; k++) { if (students[j].selected_courses[k] == id) { printf("%-12d %-15s\n", students[j].id, students[j].name); break; } } } break; } } if (found == 0) { printf("未找到该课程编号!\n"); } } //主函数main int main() { int choice; do { menu(); scanf("%d", &choice); switch (choice) { case 1: input_course_info(); break; case 2: input_student_info(); break; case 3: browse_course_info(); break; case 4: query_by_nature(); break; case 5: query_by_credits(); break; case 6: query_by_id(); break; case 7: view_course_selection(); break; case 8: printf("退出系统!\n"); break; default: printf("无效的选择,请重新输入!\n"); } } while (choice != 8); return 0; } ``` 在`input_student_info`函数里,添加了一个内层循环,用于检查当前选择的课程是否已经存在于学生已选课程列表中。若存在,就提示用户该课程已选,并让用户重新选择;若不存在,则把该课程添加到学生的已选课程列表中,同时更新相关信息。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值