Alice's Chance

來源:互聯網
上載者:User

標籤:acm   網路流   

題目連結

  • 題意:
    愛麗絲要拍電影,有n部電影,規定愛麗絲第i部電影在每個礼拜只有固定的幾天可以拍電影,且只能在前wi個周拍,並且這部電影要拍di天才能結束,問愛麗絲能不能拍完所有的電影
    第一行代表有多少組資料,對於每組資料第一行代表有n部電影,接下來2到n+1行,每行代表一個電影,每行9個數,前面7個數,1代表拍,0代表不拍,第8個數代表要拍幾天,第9個數代表有幾個礼拜時間拍
  • 分析:
    對於每個電影,di - x[0] - x[1] - ... - x[t] = 0,di表示這個電影需要的天數,x[]表示電影對應的這些天是否選擇(取值為零或一)
    對於每一天,y[0] - y[1] - ... - y[t] <= 1,1表示這一天最多拍一個電影,y[]表示對應的電影是否在這一天拍(取值為零或一)
struct Edge{    int from, to, cap, flow;    bool operator< (const Edge& rhs) const    {        return from < rhs.from || (from == rhs.from && to < rhs.to);    }};const int MAXV = 500;struct ISAP{    int n, m, s, t;    vector<Edge> edges;    vector<int> G[MAXV];   // 鄰接表,G[i][j]表示結點i的第j條邊在e數組中的序號    bool vis[MAXV];        // BFS使用    int d[MAXV];           // 從起點到i的距離    int cur[MAXV];        // 當前弧指標    int p[MAXV];          // 可增廣路上的上一條弧    int num[MAXV];        // 距離標號計數    void AddEdge(int from, int to, int cap)    {        edges.push_back((Edge) { from, to, cap, 0 });        edges.push_back((Edge) { to, from, 0, 0 });        m = edges.size();        G[from].push_back(m-2);        G[to].push_back(m-1);    }    bool BFS()    {        memset(vis, 0, sizeof(vis));        queue<int> Q;        Q.push(t);        vis[t] = 1;        d[t] = 0;        while(!Q.empty())        {            int x = Q.front();            Q.pop();            REP(i, G[x].size())            {                Edge& e = edges[G[x][i]^1];                if(!vis[e.from] && e.cap > e.flow)                {                    vis[e.from] = 1;                    d[e.from] = d[x] + 1;                    Q.push(e.from);                }            }        }        return vis[s];    }    void ClearAll(int n)    {        this->n = n;        REP(i, n)            G[i].clear();        edges.clear();    }    void ClearFlow()    {        REP(i, edges.size())            edges[i].flow = 0;    }    int Augment()    {        int x = t, a = INF;        while(x != s)        {            Edge& e = edges[p[x]];            a = min(a, e.cap-e.flow);            x = edges[p[x]].from;        }        x = t;        while(x != s)        {            edges[p[x]].flow += a;            edges[p[x]^1].flow -= a;            x = edges[p[x]].from;        }        return a;    }    int Maxflow(int s, int t, int need)    {        this->s = s;        this->t = t;        int flow = 0;        BFS();        memset(num, 0, sizeof(num));        REP(i, n) num[d[i]]++;        int x = s;        memset(cur, 0, sizeof(cur));        while(d[s] < n)        {            if(x == t)            {                flow += Augment();                if(flow >= need) return flow;                x = s;            }            int ok = 0;            FF(i, cur[x], G[x].size())            {                Edge& e = edges[G[x][i]];                if(e.cap > e.flow && d[x] == d[e.to] + 1)   // Advance                {                    ok = 1;                    p[e.to] = G[x][i];                    cur[x] = i; // 注意                    x = e.to;                    break;                }            }            if(!ok)   // Retreat            {                int m = n-1; // 初值注意                REP(i, G[x].size())                {                    Edge& e = edges[G[x][i]];                    if(e.cap > e.flow)                        m = min(m, d[e.to]);                }                if(--num[d[x]] == 0)                    break;                num[d[x] = m + 1]++;                cur[x] = 0; // 注意                if(x != s)                    x = edges[p[x]].from;            }        }        return flow;    }    vector<int> Mincut()   // call this after maxflow    {        BFS();        vector<int> ans;        REP(i, edges.size())        {            Edge& e = edges[i];            if(!vis[e.from] && vis[e.to] && e.cap > 0)                ans.push_back(i);        }        return ans;    }    void Reduce()    {        REP(i, edges.size())            edges[i].cap -= edges[i].flow;    }    void print()    {        printf("Graph:\n");        REP(i, edges.size())            printf("%d->%d, %d, %d\n", edges[i].from, edges[i].to , edges[i].cap, edges[i].flow);    }} mf;int day[18];int main(){    int T, n, d, w;    RI(T);    FE(kase, 1, T)    {        int sum = 0;        RI(n);        mf.ClearAll(n + 7 * 50 + 2);        int S = 0, T = n + 7 * 50 + 1, Max = -1;        FE(i, 1, n)        {            FE(j, 1, 7)                RI(day[j]);            RII(d, w);            sum += d;            Max = max(Max, w);            mf.AddEdge(S, i, d);            FE(j, 1, 7)                if (day[j])                {                    REP(k, w)                        mf.AddEdge(i, n + k * 7 + j, 1);                }        }        FE(i, 1, 7) REP(j, Max)            mf.AddEdge(n + j * 7 + i, T, 1);        printf("%s\n", mf.Maxflow(S, T, INF) == sum ? "Yes" : "No");    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.