教学计划编制问题 发表于 2018-01-03 | 浏览 次 LinkQueue.h123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101#ifndef _LINKQUEUE_H_#define _LINKQUEUE_H_#define QElemType int//链队列结点结构struct LinkNode { QElemType data; LinkNode *next;};//带头结点的链队列结构struct LinkQueue { LinkNode *front; //队头指针 LinkNode *rear; //队尾指针};//构造一个空的链队列。void InitQueue( LinkQueue &Q ){ Q.front = Q.rear = new LinkNode; Q.front->next = NULL;}//LinkQueue//将链队列清空。void ClearQueue( LinkQueue &Q ){ LinkNode *p; while ( Q.front->next != NULL ) { p = Q.front->next; Q.front->next = p->next; delete p; } Q.rear = Q.front;}//链队列结构销毁。LinkQueue DestroyQueue( LinkQueue &Q ){ ClearQueue( Q ); //成员函数Clear()的功能是释放链表中的所有元素结点 delete Q.front; Q.front = Q.rear = NULL;}//判链队列是否为空,若为空,则返回true,否则返回false。bool QueueEmpty( LinkQueue Q ){ return Q.front == Q.rear;}//返回链队列中元素个数。int QueueLength( LinkQueue Q ){ int i = 0; LinkNode *p = Q.front->next; while ( p != NULL ) { i++; p = p->next; } return i;}//取链队列队头元素的值。先决条件是队列不空。QElemType GetHead( LinkQueue &Q ){ return Q.front->next->data;}//取链队列队尾元素的值。先决条件是队列不空。QElemType GetLast( LinkQueue &Q ){ return Q.rear->data;}//链队列入队,插入e到队尾。void EnQueue( LinkQueue &Q, QElemType e ){ LinkNode *p; p = new LinkNode ; p->data = e; p->next = NULL; Q.rear->next = p; Q.rear = p;}//链队列出队。先决条件是队列不空。bool DeQueue( LinkQueue &Q,QElemType &e ){ if ( QueueEmpty( Q ) ) return false; LinkNode *p = Q.front->next; Q.front->next = p->next; e = p->data; if ( p == Q.rear ) Q.rear = Q.front; //若出队后队列为空,需修改Q.rear。 delete p; return true;}#endif 教学计划编制问题.cpp123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163#include "stdio.h"#include "cstring"#include "stdlib.h"#include "map"#include "string"#include "stack"#include "LinkQueue.h"#include "iostream"using namespace std;typedef long long ll;const int MAXN=200;struct ArcBox{ int tailvex,headvex; ArcBox *hlink,*tlink;};struct VexNode{ ArcBox *firstin,*firstout; // int credit;};struct Graph{ VexNode xlist[MAXN]; int vexnum,arcnum;}G;void addedge(int v1,int v2){ ArcBox *p=(ArcBox *)malloc(sizeof(ArcBox)); *p={v1,v2,G.xlist[v2].firstin,G.xlist[v1].firstout}; G.xlist[v2].firstin=G.xlist[v1].firstout=p;}std::map<string,int> CourseToId;LinkQueue que[2];char IdToCourse[MAXN][20];int in[MAXN];int list[MAXN];int credit[MAXN];bool vis[MAXN];int main(int argc, char const *argv[]) { // freopen("input.txt","r",stdin); memset(in,0,sizeof in); memset(vis,0,sizeof vis); CourseToId.clear(); for(int i=0;i<2;++i) InitQueue(que[i]); int index=0; int sumcredit=0; int numSemaster,creditlim,numCourse,numedge; printf("请输入学期数,学分上限,课程数,前置课程限制数\n" ); scanf("%d%d%d%d",&numSemaster,&creditlim,&numCourse,&numedge); G.vexnum=numCourse; G.arcnum=numCourse; for(int i=0;i<G.vexnum;i++) G.xlist[i].firstin=NULL,G.xlist[i].firstout=NULL; printf("请输入课程名和学分\n" ); for(int i=0;i<numCourse;++i) { scanf("%s %d",IdToCourse[i],&credit[i]); sumcredit+=credit[i]; CourseToId[IdToCourse[i]]=i; } printf("请输入课程的前置课程和该课程\n" ); for(int i=0;i<numedge;++i) { char c1[100],c2[100]; scanf("%s %s",c1,c2); int p1=CourseToId[c1]; int p2=CourseToId[c2]; addedge(p1,p2); in[p2]++; } ll nin[MAXN],sin[MAXN]; for(int i=0;i<numCourse;++i) sin[i]=in[i]; printf("finish all course as fast as possible\n" ); ll cnt=1; int curque=0; for(int i=0;i<numCourse;++i) if(!in[i]) EnQueue(que[curque],i); while(cnt<=numSemaster) { if(QueueEmpty(que[curque])) break; printf("Semaster %I64d: ",cnt); // for(ll i=0;i<numCourse;++i) nin[i]=in[i]; ll curcredit=0; // for(int i=0;i<numCourse && curcredit<creditlim;++i) while(!QueueEmpty(que[curque]) && curcredit<creditlim) { int u=GetHead(que[curque]); if(curcredit+credit[u]<=creditlim) { // vis[u]=1; int tem; DeQueue(que[curque],tem); curcredit+=credit[u]; printf("%s ",IdToCourse[u]); for(ArcBox *p=G.xlist[u].firstout;p!=NULL;p=(*p).tlink) { int v=(*p).headvex; in[v]--; if(!in[v]) EnQueue(que[!curque],v); } } } while(!QueueEmpty(que[curque])) { int tem; DeQueue(que[curque],tem); EnQueue(que[!curque],tem); } curque=!curque; puts(""); cnt++; } for(int i=0;i<numCourse;++i) in[i]=sin[i]; // for(int i=0;i<2;++i) // ClearQueue(que[i]); curque=0; for(int i=0;i<numCourse;++i) if(!in[i]) EnQueue(que[curque],i); printf("make the credit of each semaster as equivalent as possible\n" ); double ave=sumcredit/(double)numSemaster; cnt=1; ll cursumcredit=0; while(cnt<=numSemaster) { if(QueueEmpty(que[curque])) break; printf("Semaster %lld: ",cnt); ll curcredit=0; while(!QueueEmpty(que[curque]) && curcredit<creditlim) { // printf("test\n" ); int u=GetHead(que[curque]); if(curcredit+credit[u]<=creditlim && cursumcredit+credit[u]<=ave*cnt) { // vis[u]=1; int tem; DeQueue(que[curque],tem); curcredit+=credit[u]; cursumcredit+=credit[u]; printf("%s ",IdToCourse[u]); for(ArcBox *p=G.xlist[u].firstout;p!=NULL;p=(*p).tlink) { int v=(*p).headvex; in[v]--; if(!in[v]) EnQueue(que[!curque],v); } }else break; } while(!QueueEmpty(que[curque])){ int tem; DeQueue(que[curque],tem); EnQueue(que[!curque],tem); } curque=!curque; puts(""); cnt++; } return 0;}