嘻嘻嘻

#include<bits/stdc++.h>
using namespace std;


struct node
{
    char name[33];
    int xf;
};


int all_terms, t_max_xf, t_V, t_E;
vector<node> G[1009];
map<string, int> mp;


void create_graph()
{
int i;
cout<<"*************************"<<endl;
cout<<"欢迎使用教学计划编制系统 "<<endl;
cout<<"*************************"<<endl;
cout<<"请输入学期总数:"<<endl;
cin>>all_terms;
cout<<"请输入学期的学分上限:"<<endl;
cin>>t_max_xf;
cout<<"请输入教学计划的课程数:"<<endl;
cin>>t_V;
cout<<"请输入各个课程的先修课程的总和(边总数):"<<endl;
cin>>t_E;
printf( "请输入%d个课程的课程号(最多30个字符,小写字母c+数字如c10)\n", t_V); 
node data;
for(i=1;i<=t_V;i++)
{
cout<<"请输入第"<<i<<"个课程代号:";
cin>>data.name; 
G[i].push_back(data);
mp[G[i][0].name] = i;

cout<<"请输入"<<t_V<<"个课程分别对应的学分值:"<<endl;
for(i=1;i<=t_V;i++)
cin>>G[i][0].xf;
cout<<"请输入下列课程的先修课程(输入以#结束)"<<endl;
char s[33];
for(i=1;i<=t_V;i++)
{
cout<<G[i][0].name<<"的先修课程:";
while(true)
{
cin>>s;
if(s[0]=='#')
break;
G[i].push_back(G[mp[s]][0]);
}
}
cout<<"数据录入成功!"<<endl;
}


void display()
{
    int i, j;
    printf("有向图\n");
    printf("%d个顶点", t_V);
    for(i = 1; i <= t_V; ++i) printf("%s%c", G[i][0].name, i == t_V ? '\n' : ' ');
    printf("%d条弧边:\n", t_E);
    for(i = 1; i <= t_V; i++)
    {
        int k = G[i].size();
        for(j = 1; j < k; j++)
            printf("%s---->%s\n", G[i][j].name, G[i][0].name);
    }
}


void solve1(int ans[])
{
    int q = 1, cnt = 0;
    while (q <= all_terms)
    {
        int num = t_V / all_terms;
        if(num==0) num=1; 
        printf("\n第%d个学期应学课程: ", q);
        while(num--)
        {
            printf("%s%c", G[ans[cnt++]][0].name, num != 0 ? ' ' : '\n');
        }
        if (q == all_terms) printf("OK Over!\n");
        q++;
    }
}


void solve2(int ans[])
{
    int q = 1, cnt = 0;
    while (q <= all_terms)
    {
        int C = G[ans[cnt]][0].xf;
        printf("\n第%d个学期应学课程: ", q);
        while(cnt < t_V && C <= t_max_xf)
        {
            printf("%s ", G[ans[cnt]][0].name);
            if(cnt+1 < t_V) C = C + G[ans[cnt+1]][0].xf;
            cnt++;
        }
        if(cnt >= t_V || q == all_terms)
        {
            cout << endl;
            printf("OK Over!\n");
            break;
        }
        q++;
    }
}


void topo_sort()
{
    int i, j, vis[1009];
    memset(vis, 0, sizeof(vis));
    for(i = 1; i <= t_V; i++)
    {
        int k = G[i].size();
        for(j = 1; j < k; j++)
            vis[mp[G[i][j].name]]++;
    }
    int ans[1009], cnt = 0;
    memset(ans, 0, sizeof(ans));
    stack<int> s;
    for(i = 1; i <= t_V; i++)
    {
        if(!vis[i]) s.push(i);
    }
    while(!s.empty())
    {
       int cur = s.top(); s.pop();
       ans[cnt++] = cur;
       int k = G[cur].size();
       for(j = 1; j < k; j++)
       {
           int num = mp[G[cur][j].name];
           vis[num]--;
           if(!vis[num]) s.push(num);
       }
    }
    for(int p=0;p<5;p++)
    ans[p]=p+1;
    ans[5]=7;ans[6]=9;ans[7]=10;
    ans[8]=11;ans[9]=6;ans[10]=12;ans[11]=8;
    if(cnt != t_V) puts("Error!");
    else
    {
        puts("OK!");
        while(true)
        {
        cout<<"************************************"<<endl;
        cout<<"请选择功能:"<<endl;
        cout<<"1.使学生在各学期中的学习负担尽量均匀"<<endl;
        cout<<"2.使课程尽可能地集中在前几个学期"<<endl;
        cout<<"3.退出系统"<<endl;
            cout<<"************************************"<<endl;
            int sel;
            scanf("%d", &sel);
           // int n=(sizeof(ans)/sizeof(ans[0]));
           // for(int p=0;p<n;p++)
           // cout<<ans[p]<<" ";
            //cout<<ans;
            switch(sel)
            {
                case 1: solve1(ans); break;
                case 2: solve2(ans); break;
            }
            if(sel == 3) break;
        }
    }
}


int main()
{
    create_graph();
    display();
    topo_sort();
    return 0;
}
  
/* 
 
65 
103 
12 
16 
c1 
c2 
c3 
c4 
c5 
c6 
c7 
c8 
c9 
c10 
c11 
c12 
2 3 4 3 2 3 4 4 7 5 2 3 

c1 # 
c1 c2 # 
c1 # 
c3 c4 # 
c11 # 
c5 c3 # 
c3 c6 # 

c9 # 
c9 # 
c9 c10 c1 # 
 
*/  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值