tjut 2883

来源:互联网 发布:手机淘宝我的尺码在哪 编辑:程序博客网 时间:2024/04/29 23:32
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#include<queue>#include<vector>#define inf 0x7fffffffusing namespace std;const int maxn=600+10;const int M = 999999;int n,m,from,to;int d[maxn];struct node{    int v,flow;    int next;}edge[M*2];int head[maxn],edgenum;void add(int u,int v,int flow){    edge[edgenum].v=v ;edge[edgenum].flow=flow ;    edge[edgenum].next=head[u];    head[u]=edgenum++;    edge[edgenum].v=u ;edge[edgenum].flow=0;    edge[edgenum].next=head[v];    head[v]=edgenum++;}int bfs(){    memset(d,0,sizeof(d));    d[from]=1;    queue<int> Q;    Q.push(from);    while (!Q.empty())    {        int u=Q.front() ;Q.pop() ;        for (int i=head[u] ;i!=-1 ;i=edge[i].next)        {            int v=edge[i].v;            if (!d[v] && edge[i].flow>0)            {                d[v]=d[u]+1;                Q.push(v);                if (v==to) return 1;            }        }    }    return 0;}int dfs(int u,int flow){    if (u==to || flow==0) return flow;    int cap=flow;    for (int i=head[u] ;i!=-1 ;i=edge[i].next)    {        int v=edge[i].v;        if (d[v]==d[u]+1 && edge[i].flow>0)        {            int x=dfs(v,min(cap,edge[i].flow));            edge[i].flow -= x;            edge[i^1].flow += x;            cap -= x;            if (cap==0) return flow;        }    }    return flow-cap;}int dinic(){    int sum=0;    while (bfs()) sum += dfs(from,inf);    return sum;}int main(){    while (scanf("%d%d",&n,&m)!=EOF)    {        memset(head,-1,sizeof(head));        edgenum=0;        int s[222],q[222],e[222],t[222];        int time[maxn],cnt=1;        memset(time,0,sizeof(time));        int sum=0;        for (int i=1 ;i<=n ;i++)        {            scanf("%d%d%d%d",&s[i],&q[i],&e[i],&t[i]);            sum += q[i]*t[i];            time[cnt++]=s[i];            time[cnt++]=e[i];        }        sort(time+1,time+cnt);        int c=0;        for (int i=1 ;i<cnt ;i++)        {            if (time[c] != time[i])                time[++c]=time[i];        }        from=n+c+1;        to=from+1;        for (int i=1 ;i<=n ;i++)            add(from,i,q[i]*t[i]);        for (int i=1 ;i<=c ;i++)        {            add(n+i,to,m*(time[i]-time[i-1]));            for (int j=1 ;j<=n ;j++)            {                if (s[j]<=time[i-1] && time[i]<=e[j])                    add(j,n+i,inf);            }        }        if (sum==dinic()) printf("Yes\n");        else printf("No\n");    }    return 0;}

0 0
原创粉丝点击