Software Allocation
A computing center has ten different computers (numbered 0 to 9) on which applications can run. The computers are not multi-tasking, so each machine can run only one application at any time. There are 26 applications, named A to Z. Whether an application can run on a particular computer can be found in a job description (see below).Software Allocation |
Every morning, the users bring in their applications for that day. It is possible that two users bring in the same application; in that case two different, independent computers will be allocated for that application.
A clerk collects the applications, and for each different application he makes a list of computers on which the application could run. Then, he assigns each application to a computer. Remember: the computers are not multi-tasking, so each computer must handle at most one application in total. (An application takes a day to complete, so that sequencing i.e. one application after another on the same machine is not possible.)
A job description consists of
- one upper case letter A...Z, indicating the application.
- one digit 1...9, indicating the number of users who brought in the application.
- a blank (space character.)
- one or more different digits 0...9, indicating the computers on which the application can run.
- a terminating semicolon `;'.
- an end-of-line.
Input
The input for your program is a textfile. For each day it contains one or more job descriptions, separated by a line containing only the end-of-line marker. The input file ends with the standard end-of-file marker. For each day your program determines whether an allocation of applications to computers can be done, and if so, generates a possible allocation.Output
The output is also a textfile. For each day it consists of one of the following:- ten characters from the set {`A'...`Z' , `_'}, indicating the applications allocated to computers 0 to 9 respectively if an allocation was possible. An underscore `_' means that no application is allocated to the corresponding computer.
- a single character `!', if no allocation was possible.
Sample Input
A4 01234; Q1 5; P4 56789; A4 01234; Q1 5; P5 56789;
Sample Output
AAAA_QPPPP ! Maximum Network Flow#include<stdio.h> #include<cstring> #include<string> #include<vector> #define REP(i, b, n) for (int i = b; i < n; i++) #define rep(i,n) REP(i, 0, n) #define DBG 0 using namespace std; int N,TSN; vector<int>egs[50]; int wgt[50][50],p[50],pf[50],gap[50],h[50],PI[50]; int isap(int s,int t){ int i,b,c=s,f=int(1e9),res=0; memset(gap,0,sizeof(gap)); memset(h,0,sizeof(h)); memset(p,0,sizeof(p)); pf[s]=int(1e9), p[s]=s; if(DBG)printf("N %d\n",N); while(1){ if(DBG)printf("isap %d f %d h %d\n",c,f,h[c]); b=-1; rep(i,egs[c].size()){ int d=egs[c][i]; //if(DBG)printf("wgt[%d][%d]=%d\n",c,b,wgt[c][b]); if(wgt[c][d]>0&&h[c]==h[d]+1){b=egs[c][i];break;} } if(b==t){ f=min(f,wgt[c][b]); res+=f; if(DBG)printf("t: computer %d res %d\n",c-27,res); for(;b!=s;PI[b]=c,b=c,c=p[c]){ wgt[c][b]-=f,wgt[b][c]+=f; if(DBG)printf("f %d wgt[%d][%d]=%d\n",f,c,b,wgt[c][b]); } c=s,f=int(1e9); } else if(b>=0){ if(DBG)printf("move to %d, ",b); pf[b]=f; f=min(f,wgt[c][b]); if(DBG)printf("f %d\n",f); p[b]=c; c=b; } else{ if(DBG)printf("raise %d: %d\n",c, h[c]+1); if(--gap[h[c]]==0)break; ++gap[++h[c]]; f=pf[c]; c=p[c]; } } return res; } void ans(){ memset(PI,0,sizeof(PI)); int res=isap(0,49); if(res==TSN){rep(i,10)if(PI[i+27])printf("%c",PI[i+27]+'@');else printf("_");printf("\n");} else printf("!\n"); } int main(){ int cn,tn; char chs[100]; N=12; while(fgets(chs,100,stdin)){ if(chs[0]=='\n'){ ans(); TSN=0,N=12,memset(wgt,0,sizeof(wgt));rep(i,50)egs[i].clear(); scanf(" "); continue; } N++; if(chs[strlen(chs)-1]=='\n')chs[strlen(chs)-1]='\0'; tn=chs[0]-'@'; egs[0].push_back(tn); wgt[0][tn]=chs[1]-'0'; TSN+=wgt[0][tn]; //all tasks if(DBG)printf("task %d\n",tn); rep(i,10)egs[i+27].push_back(49); REP(i,3,strlen(chs)-1){ cn=chs[i]-'0'+27; if(DBG)printf(" com %d\n",cn); egs[tn].push_back(cn),egs[cn].push_back(tn); wgt[tn][cn]=1,wgt[cn][49]=1; } } if(egs[0].size())ans(); }
沒有留言:
張貼留言