Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
wa 了无数次 为什么就不对呢 ???请求指出思路上有什么问题..这么想的 源点和1-7天之间容量无限大 ,1-7天和week之间要么为0要么为1 week和 task之间 有关联的容量无限大 task和汇点之间容量为 已知天数 最后最大流等于总需要天数时 返回yes 最多有 7+ 50 +20 +2 =79个点不算很大。。。可还是不对 代码: #include<iostream> #include<algorithm> #include<queue> #include<cstring> using namespace std; #define inf (1<<30) typedef struct Node{ int prenum; int token; int con; }node; typedef node* mnode; mnode newnode(){ mnode m=new node(); m->prenum=0; m->token=0; m->con=0; //瀹归噺 return m; } mnode v[100]; int mc[100][100]; int ma[100][100]; int week[8]; int check[100]; int main(){ const int totaltask = 20; const int totalweek = 50; int n;cin>>n; int work,numofweek,flow,sum; for(int i=0;i<100;i++){ v[i]=newnode(); } while(n--){ sum=0; memset(mc,0,sizeof(mc)); memset(ma,0,sizeof(ma)); memset(check,0,sizeof(check)); cin>>work; for(int i=1;i<=work;i++){ for(int j=1;j<=7;j++){ cin>>week[j]; } cin>>flow>>numofweek; sum+=flow; for(int j=1;j<=7;j++){ mc[0][j]=inf; } for(int j=1;j<=numofweek;j++){ for(int k=1;k<=7;k++){ if(week[k]) { mc[k][7+j]=1; } } mc[7+j][7+totalweek+i]=inf; } mc[7+totalweek+i][7+totalweek+work+1]=flow; } /*for(int i=0;i<=8+totalweek+work;i++){ for(int j=0;j<=8+totalweek+work;j++){ cout<<mc[i][j]<<" "; } cout<<endl; } */ int dest=8+totalweek+work; queue< int> q; //浠?寮€濮? bool flag=true; while(flag){ memset(check,0,sizeof(check)); for(int i=0;i<=dest;i++){ v[i]->prenum=-1; v[i]->token=0; v[i]->con=0; } while(!q.empty()) q.pop(); v[0]->con=0; v[0]->con=inf; check[0]=1; q.push(0); while(check[dest]==0){ //n鐐规爣璁颁簡 杩樻病妫€鏌? bool allcheck=true; for(int k=0;k<=dest;k++){ if(check[k]==1) {allcheck=false;break;} } if(allcheck){ int count=0; //浠€涔堟椂鍊欐墠浼氳繘鍏ヨ繖閲屽憿 锛屽彧鏈夊綋鎵句笉鍒板骞胯矾鐨勬椂鍊? for(int k=0;k<=dest;k++){ count+=ma[k][dest]; } if(count==sum) cout<<"YES"<<endl; else cout<<"NO"<<endl; flag=false; break; } int inum=q.front(); q.pop(); for(int i=0;i<=dest;i++){ if(i==inum) continue; if(ma[inum][i]<mc[inum][i]&&check[i]==0){ check[i]=1; q.push(i); v[i]->prenum=inum; v[i]->con=min(v[inum]->con,mc[inum][i]-ma[inum][i]); } else if(ma[i][inum]>0&&check[i]==0){ check[i]=1; q.push(i); v[i]->prenum=inum; v[i]->token=1; v[i]->con=min(v[inum]->con,ma[i][inum]); } } check[inum]=2; } if(flag){ int j=dest; while(j!=0){ int be=v[j]->prenum; if(v[j]->token==0) { ma[be][j]+=v[dest]->con; } else { ma[j][be]-=v[dest]->con; } j=be; } } } } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator