玄学?待补

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/fufck/article/details/84666720
今日推荐