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 }
View Code

 

posted @ 2017-04-29 14:38  Wally的博客  阅读(203)  评论(0编辑  收藏  举报