版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fufck/article/details/84666720
3572 Task Schedule
不知为何超时 ?
/*
复杂度:O(n2m)
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int max_n=1005;
const int max_m=500005;
const int max_e=max_m*2;
const int inf=1e9;
int point[max_n],sum,p[5010],s[5010],e[510],nt[max_e],v[max_e],remain[max_e],deep[max_n];
int n,m,ss,x,y,cap,tot,maxflow;
queue<int> q;
void add(int x,int y,int cap)
{
++tot;nt[tot]=point[x];point[x]=tot;v[tot]=y;remain[tot]=cap;
++tot;nt[tot]=point[y];point[y]=tot,v[tot]=x;remain[tot]=0;
}
bool bfs(int s,int t)
{
memset(deep,-1,sizeof(deep));
deep[s]=0;
while (!q.empty()) q.pop();
q.push(s);
while (!q.empty())
{
int now=q.front();q.pop();
for(int i=point[now];i!=-1;i=nt[i])
if(deep[v[i]]==-1&&remain[i])
{
deep[v[i]]=deep[now]+1;
q.push(v[i]);
}
}
return deep[t]!=-1;
}
int dfs(int now,int limit)//limit是流量
{
if(!limit||now==ss+n+1) return limit;
int flow=0,f;
for(int i=point[now];i!=-1;i=nt[i])
{
if(deep[v[i]]==deep[now]+1&&(f=dfs(v[i],min(limit,remain[i]))))
{
flow+=f;limit-=f;
remain[i]-=f;remain[i^1]+=f;
if(!limit) break;
}
}
if(flow==0) deep[now]=-1;
return flow;
}
void dinic(int s,int t)
{
while(bfs(s,t)) maxflow+=dfs(s,inf);
}
void init()
{
ss=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&p[i],&s[i],&e[i]),sum+=p[i];
ss=max(ss,e[i]);
}
//printf("%d\n",ss);
for(int i=1;i<=ss;i++) add(i,ss+n+1,m);
for(int i=ss+1;i<=ss+n;i++) add(0,i,p[i-ss]);
for(int i=1;i<=n;i++)
{
for(int j=s[i];j<=e[i];j++) add(ss+i,j,1);
}
}
int main()
{
int T,cas=0;
scanf("%d",&T);
memset(point,-1,sizeof(point));
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=0;
tot=-1;maxflow=0;
init();
dinic(0,ss+n+1);
if(sum==maxflow)printf("Case %d: Yes\n",++cas);
else printf("Case %d: No\n",++cas);
for(int i=0;i<=tot;i++) point[i]=-1;
printf("\n");
}
}
我的 577ms
/*
复杂度:O(n2m)
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
const int max_n=1005;
const int max_m=500005;
const int max_e=max_m*2;
const int inf=1<<30;
int frist[max_n],sum,p[5010],s[5010],e[510],nt[max_e],v[max_e],remain[max_e],deep[max_n];
int n,m,ss,x,y,cap,tot,maxflow;
queue<int> q;
void add(int x,int y,int cap)
{
++tot;nt[tot]=frist[x];frist[x]=tot;v[tot]=y;remain[tot]=cap;
++tot;nt[tot]=frist[y];frist[y]=tot,v[tot]=x;remain[tot]=0;
}
bool bfs(int s,int t)
{
memset(deep,-1,sizeof(deep));
deep[s]=0;
//while (!q.empty()) q.pop();
q.push(s);
while (!q.empty())
{
int now=q.front();q.pop();
for(int i=frist[now];i!=-1;i=nt[i])
{
int tt=v[i];
if(deep[tt]==-1&&remain[i])
{
deep[tt]=deep[now]+1;
q.push(tt);
}
}
}
return deep[t]!=-1;
}
int dfs(int now,int limit)//limit是流量
{
if(now==ss+n+1) return limit;
int flow=0,f;
for(int i=frist[now];i!=-1&&flow<limit;i=nt[i])
{
if(deep[v[i]]==deep[now]+1&&remain[i])
{
int b=dfs(v[i],min(limit-flow,remain[i]));
flow+=b;
remain[i]-=b;remain[i^1]+=b;
}
}
if(flow==0) deep[now]=-1;
return flow;
}
void dinic(int s,int t)
{
}
void init()
{
ss=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&p[i],&s[i],&e[i]),sum+=p[i];
ss=max(ss,e[i]);
}
for(int i=1;i<=ss;i++) add(i,ss+n+1,m);
for(int i=ss+1;i<=ss+n;i++) add(0,i,p[i-ss]);
for(int i=1;i<=n;i++)
for(int j=s[i];j<=e[i];j++) add(ss+i,j,1);
}
int main()
{
// freopen("1.txt","r",stdin);
// freopen("1.out","w",stdout);
int T,cas=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(frist,-1,sizeof(frist));
sum=0;tot=-1;maxflow=0;init();
while(bfs(0,ss+n+1))
{
while(1)
{
int a = dfs(0,inf);
if(!a)break;
maxflow+=a;
}
}
if(sum==maxflow)printf("Case %d: Yes\n",++cas);
else printf("Case %d: No\n",++cas);
printf("\n");
}
return 0;
}
网上 140ms
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 1<<30
#define MOD 1000000007
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pi acos(-1.0)
using namespace std;
const int MAXN = 1010;
const int MAXM = 200010;
struct node{
int to;
int val;
int next;
}edge[MAXM*2];
int x[MAXN],y[MAXN],z[MAXN];
int pre[MAXN],vis[MAXN],ind,k,n,m,S,T;
void add(int x,int y,int z){
edge[ind].to = y;
edge[ind].val = z;
edge[ind].next = pre[x];
pre[x] = ind ++;
}
bool bfs(){
queue<int>q;
memset(vis,-1,sizeof(vis));
vis[S] = 0;
q.push(S);
while(!q.empty()){
int tp = q.front();
q.pop();
for(int i = pre[tp]; i != -1; i = edge[i].next){
int t = edge[i].to;
if(vis[t] == -1 && edge[i].val){
vis[t] = vis[tp] + 1;
q.push(t);
}
}
}
return vis[T] != -1;
}
int dfs(int rt,int low){
int used = 0;
if(rt == T){
return low;
}
for(int i = pre[rt]; i != -1 && used < low; i = edge[i].next){
int t = edge[i].to;
if(vis[t] == vis[rt] + 1 && edge[i].val){
int b = dfs(t,min(low-used,edge[i].val));
edge[i].val -= b;
edge[i^1].val += b;
used += b;
}
}
if(used == 0){
vis[rt] = -1;
}
return used;
}
int main(){
int t,ff = 0;
scanf("%d",&t);
while(t--){
scanf("%d%d",&m,&k);
ind = 0;
memset(pre,-1,sizeof(pre));
n = 0;
ll all = 0;
for(int i = 1; i <= m; i++){
int fx,fy,fz;
scanf("%d%d%d",&fx,&fy,&fz);
x[i] = fy;
y[i] = fx;
z[i] = fz;
n = max(n,z[i]);
all += y[i];
}
for(int i = 1; i <= m; i++){
for(int j = x[i]; j <= z[i]; j++){
add(i,j+m,1),add(j+m,i,0);
}
}
S = 0,T = m + n + 1;
for(int i = 1; i <= m; i++){
add(S,i,y[i]),add(i,S,0);
}
for(int i = 1; i <= n; i++){
add(i+m,T,k),add(T,i+m,0);
}
ll ans = 0;
while(bfs()){
while(1){
ll a = dfs(S,INF);
if(!a)break;
ans += a;
}
}
//cout<<S<<" "<<T<<endl;
printf("Case %d: ",++ff);
if(ans == all){
printf("Yes\n");
}
else {
printf("No\n");
}
printf("\n");
}
return 0;
}