Gym - 101097B Programming Contest(dfs)
https://vjudge.net/contest/160830#problem/B
题意:给你n个参赛团队,m个问题,每个问题要r分钟,比赛的总时间是t,总的团队数量k。输出要解决的问题数量以及花费的总时间,然后输出解决问题的人和解决的问题号以及解决问题的开始时间。
1 #include <iostream> 2 #include <bits/stdc++.h> 3 using namespace std; 4 const int maxn=505; 5 vector<int>vec[maxn]; 6 int cnt[maxn],vis[maxn],temp[maxn]; 7 int dfs(int k) 8 { 9 for(int i=0;i<vec[k].size();i++) 10 { 11 int t=vec[k][i]; 12 if(vis[t]) continue; 13 vis[t]=1; 14 if(cnt[t]==0||dfs(cnt[t])) 15 { 16 cnt[t]=k; 17 return 1; 18 } 19 } 20 return 0; 21 } 22 int main() 23 { 24 freopen("contest.in","r",stdin); 25 freopen("contest.out","w",stdout); 26 int n,m,r,t,k,x,y; 27 while(~scanf("%d%d%d%d%d",&n,&m,&r,&t,&k)) 28 { 29 for(int i=0;i<k;i++) 30 { 31 scanf("%d%d",&x,&y); 32 vec[x].push_back(y); 33 } 34 memset(cnt,0,sizeof(cnt)); 35 int flag=0,ans1=0,ans2=0; 36 for(int i=1;i*r<=t;i++) 37 { 38 flag=0; 39 for(int j=1;j<=n;j++) 40 { 41 memset(vis,0,sizeof(vis)); 42 if(dfs(j)) 43 { 44 flag=1; 45 ans1++; 46 ans2+=i*r; 47 } 48 } 49 if(!flag) 50 break; 51 } 52 printf("%d %d\n",ans1,ans2); 53 memset(temp,0,sizeof(temp)); 54 for(int i=1;i<=m;i++) 55 { 56 if(cnt[i]==0) continue; 57 printf("%d %d %d\n",cnt[i],i,temp[cnt[i]]); 58 temp[cnt[i]]+=r; 59 } 60 } 61 return 0; 62 }