cjb-poi2011programmingcontest1
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#define rep(i,n) for(int i=1;i<=n;i++)
#define mp make_pair
#define pb push_back
using namespace std;
#define PI 3.1415926535897932384626433
#define N 510
#define M 250010
#define LF double
#define stack stck
int g[N],nxt[M],v[M],f[N],b[N],tot=0;
int n,m,r,t,k;
void add(int x,int y)
{
v[++tot]=y;
nxt[tot]=g[x];
g[x]=tot;
}
bool find(int x){
for(int i=g[x];i;i=nxt[i])if(!b[v[i]]){
b[v[i]]=1;
if(!f[v[i]]||find(f[v[i]]))return f[v[i]]=x,1;
}
return 0;
}
int bad[N];
vector<int> work[N];
int main()
{
cin>>n>>m>>r>>t>>k;
rep(i,k)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
for(int j=1;j<=m;j++)f[j]=0;
int ans=0;
int anst=0;
for(int ti=1;ti<=t/r;ti++)
{
for(int i=1;i<=n;i++)
if (!bad[i])
{
for(int j=1;j<=m;j++)b[j]=0;
if(find(i))ans++,anst+=ti;
else bad[i]=1;
}
if (ans==m)break;
}
printf("%d %lld\n",ans,1ll*anst*r);
rep(i,m)work[f[i]].pb(i);
rep(i,n)
{
int wait=0;
for(auto p:work[i]){ printf("%d %d %d\n",i,p,wait); wait+=r; }
}
}
}}}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#define rep(i,n) for(int i=1;i<=n;i++)
#define mp make_pair
#define pb push_back
using namespace std;
#define PI 3.1415926535897932384626433
#define N 510
#define M 250010
#define LF double
#define stack stck
int g[N],nxt[M],v[M],f[N],b[N],tot=0;
int n,m,r,t,k;
void add(int x,int y)
{
v[++tot]=y;
nxt[tot]=g[x];
g[x]=tot;
}
bool find(int x){
for(int i=g[x];i;i=nxt[i])if(!b[v[i]]){
b[v[i]]=1;
if(!f[v[i]]||find(f[v[i]]))return f[v[i]]=x,1;
}
return 0;
}
int bad[N];
vector<int> work[N];
int main()
{
cin>>n>>m>>r>>t>>k;
rep(i,k)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
for(int j=1;j<=m;j++)f[j]=0;
int ans=0;
int anst=0;
for(int ti=1;ti<=t/r;ti++)
{
for(int i=1;i<=n;i++)
if (!bad[i])
{
for(int j=1;j<=m;j++)b[j]=0;
if(find(i))ans++,anst+=ti;
else bad[i]=1;
}
if (ans==m)break;
}
printf("%d %lld\n",ans,1ll*anst*r);
rep(i,m)work[f[i]].pb(i);
rep(i,n)
{
int wait=0;
for(auto p:work[i]){ printf("%d %d %d\n",i,p,wait); wait+=r; }
}
}