1. 程式人生 > >即使摸爬滾打,滿身泥濘,我也要前進

即使摸爬滾打,滿身泥濘,我也要前進

大致題意:給出一個DAG,問能否用n+1條可重複路徑覆蓋整個圖。

最小有重複路徑覆蓋問題,先傳遞閉包,轉化成無重複路徑覆蓋問題。 然後把原圖每個點拆成兩個點建立二分圖,然後用原圖點數-最大匹配數就是答案。 如果可以覆蓋就輸出AKAK,否則二分一個最大可行權值midmid,大於midmid的點連一個i>ii -> i的邊,表示忽略這個點,然後照常建圖即可。

#define others
#ifdef poj
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio> #include <algorithm> #include <vector> #include <string> #include <map> #include <set> #endif // poj #ifdef others #include <bits/stdc++.h> #include <ext/rope> #include <ext/pb_ds/priority_queue.hpp> #endif // others //#define file #define
all(x) x.begin(), x.end()
using namespace std; using namespace __gnu_pbds; using namespace __gnu_cxx; #define eps 1e-8 const double pi = acos(-1.0); typedef long long LL; typedef long long DLL; typedef unsigned long long ULL; void umax(LL &a, LL b) { a = max(a, b); } void umin(LL &a, LL b)
{ a = min(a, b); } int dcmp(double x) { return fabs(x) <= eps?0:(x > 0?1:-1); } void file() { freopen("data_in.txt", "r", stdin); freopen("data_out.txt", "w", stdout); } DLL mod = 1e9; DLL Pow(DLL a,DLL b) { DLL res=1; a%=mod; for(; b; b>>=1) { if(b&1)res=res*a%mod; a=a*a%mod; } return res; } // //void print(DLL x) { // if(x < 0) { // x = -x; // putchar('-'); // } // if(x > 9) print(x/10); // putchar(x%10 + '0'); //} //#define iostart //#define iostart #define pb(x) push_back(x) namespace solver { const int maxn = 510; int n, m; int g[maxn][maxn]; vector<int> G[maxn]; int link[maxn], vis[maxn]; int v[maxn]; bool dfs(int u) { for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(!vis[v]) { vis[v] = 1; if(link[v] == -1 || dfs(link[v])) { link[v] = u; return 1; } } } return 0; } int gao() { int ans = 0; memset(link, -1, sizeof link); for(int i = 1; i <= m; i++) { memset(vis, 0, sizeof vis); if(dfs(i)) ans++; } return ans; } bool check_val(int x) { for (int i = 1; i <= m; i++) { G[i].clear(); } for (int i = 1; i <= m; i++){ if (v[i] > x) { G[i].push_back(i); } for (int j = 1; j <= m; j++){ if (g[i][j]) { G[i].push_back(j); // cout << i << " xx " << j << endl; } } } int match = gao(); // cout << x << " " << m - match << endl; return m - match <= n + 1; } vector<int> hash_val; void solve() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++){ int val, k; scanf("%d%d", &val, &k); v[i] = val; hash_val.push_back(val); while (k--) { int to; scanf("%d", &to); g[i][to] = 1; } } for (int k = 1; k <= m; k++) { for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { if (g[i][k] && g[k][j]) { g[i][j] = 1; } } } } sort(all(hash_val)); hash_val.erase(unique(all(hash_val)), hash_val.end()); int L = 0, R = (int)hash_val.size() - 2, M; while (L + 4 < R) { M = L + R >> 1; if (check_val(hash_val[M])) { L = M; } else { R = M; } } for (; L < R; L++) { if (!check_val(hash_val[L])) break; } if (check_val(hash_val[L])) { puts("AK"); } else { printf("%d\n", hash_val[L]); } } } int main() { #ifdef iostart ios::sync_with_stdio(0); cin.tie(0); #endif // iostart // file(); solver::solve(); return 0; }

由於傳遞閉包之後是一個稠密圖,所以可以用bitset去優化匈牙利演算法。

#define others
#ifdef poj
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#endif // poj
#ifdef others
#include <bits/stdc++.h>
#include <ext/rope>
#include <ext/pb_ds/priority_queue.hpp>
#endif // others
//#define file
#define all(x) x.begin(), x.end()
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
#define eps 1e-8
const double pi = acos(-1.0);


typedef long long LL;
typedef long long DLL;
typedef unsigned long long ULL;
void umax(LL &a, LL b) {
    a = max(a, b);
}
void umin(LL &a, LL b) {
    a = min(a, b);
}
int dcmp(double x) {
    return fabs(x) <= eps?0:(x > 0?1:-1);
}
void file() {
    freopen("data_in.txt", "r", stdin);
    freopen("data_out.txt", "w", stdout);
}

DLL mod = 1e9;

DLL Pow(DLL a,DLL b) {
    DLL res=1;
    a%=mod;
    for(; b; b>>=1) {
        if(b&1)res=res*a%mod;
        a=a*a%mod;
    }
    return res;
}
//
//void print(DLL x) {
//    if(x < 0) {
//        x = -x;
//        putchar('-');
//    }
//    if(x > 9) print(x/10);
//    putchar(x%10 + '0');
//}
//#define iostart
//#define iostart
#define pb(x) push_back(x)
namespace solver {
    const int maxn = 510;
    int n, m;
    int g[maxn][maxn];
    int a[maxn][maxn/32+1], b[maxn][maxn/32+1];
    int link[maxn], vis[maxn];
    int q[maxn];

    typedef int U;
    int tot = m >> 5;
    inline void set1(U v[],int x){v[x>>5]|=1U<<(x&31);}
    inline void flip(U v[],int x){v[x>>5]^=1U<<(x&31);}
    bool dfs(int u) {
        for (int i = 0; i <= tot; i++) {
            for (;;) {
                U o = b[u][i]&vis[i];
                if (!o) break;
                int y = i<<5|__builtin_ctz(o);
                flip(vis, y);
                if (!link[y] || dfs(link[y])) return link[y]=u, 1;
            }
        }
        return 0;
    }
    int gao() {
        for (int i = 1; i <= m; i++) link[i] = 0;
        int ans = 0;
        for(int i = 1; i <= m; i++) {
            for (int j = 1; j <= m; j++) set1(vis, j);
            if(dfs(i)) ans++;
        }
        return ans;
    }
    bool check_val(int x) {
        for (int i = 1; i <= m; i++){
            for (int j = 0; j <= tot; j++) {
                b[i][j] = a[i][j];
            }
        }
        for (int i = 1; i <= m; i++) {
            if (q[i] > x) {
                set1(b[i], i);
            }
        }
        for (int i = 1; i <= m; i++) link[i] = 0;
        int match = gao();
        return m - match <= n + 1;
    }
    vector<int> hash_val;
    void solve() {
        scanf("%d%d", &n, &m);
        tot = m >> 5;
        for (int i = 1; i <= m; i++){
            int val, k;
            scanf("%d%d", &val, &k);
            q[i] = val;
            hash_val.push_back(val);
            while (k--) {
                int to;
                scanf("%d", &to);
                g[i][to] = 1;
            }
        }
        for (int k = 1; k <= m; k++) {
            for (int i = 1; i <= m; i++) {
                for (int j = 1; j <= m; j++) {
                    if (g[i][k] && g[k][j]) {
                        g[i][j] = 1;
                    }
                }
            }
        }
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= m; j++) {
                if (g[i][j])
                    set1(a[i], j);
            }
        }
        sort(all(hash_val));
        hash_val.erase(unique(all
            
           

相關推薦

即使摸爬滾打滿身泥濘前進

大致題意:給出一個DAG,問能否用n+1條可重複路徑覆蓋整個圖。 最小有重複路徑覆蓋問題,先傳遞閉包,轉化成無重複路徑覆蓋問題。 然後把原圖每個點拆成兩個點建立二分圖,然後用原圖點數−-−最大匹配數就是答案。 如果可以覆蓋就輸出AKAKAK,否則二分一個最大可行

Delphi春天將來臨Android遇到XE7是醉了Hello World

感覺 員工 end std iss 固態硬盤 add sso 企業 回首往日,從Delphi 7走到如今。總感覺不慍不火。期間論壇倒掉無數,沒倒掉的也半死不活,大批的程序猿轉向C#,Java,PHP。 Delphi的開發高效有目共睹,一直不忍放棄。Delphi以前一夜之

終於出一本C#的書了 - 的寫作歷程與C#書單推薦

必須 並發編程 人工 後來 做成 沒有 wcf learn 可能 我之前的面試題停了很久,是因為 - 我寫書去了。 前言 我於2012年3月開始工作,到現在馬上就滿六年了。這六年裏,我從一個連Sql server是什麽都不知道,只會寫最簡單的c#的程序員開始做起,一步一

不寫一行代碼綠色三層

mdb ces get type 今天 auth 訪問 參數 registry http://www.cnblogs.com/zhqian/archive/2010/07/06/1771798.html 沒有一行代碼的三層,功能肯定非常的簡單,但是,再簡單,我們也三層了,

「newbee-mall新蜂商城開源啦」GitHub 上最熱門的 Spring Boot 專案做一次靚仔!

>沒有一個冬天不可逾越,也沒有一個春天不會到來。 介紹一下新蜂商城的近況,同時,新蜂商城 Vue 版本目前也在開發中,在這篇文章裡我也向大家公佈一下新蜂商城 Vue 版本的開發進度,和大家同步一下,在不久後也會進行所有原始碼的開源。 ## GitHub 上最熱門的專案榜單 有一天,群裡的一位朋友忽然發了

文件操作是一個存為字符串格式的登陸系統有增刪改查的功能但不是的。。。

str repl 修改 blog 一個 ice body pwd 刪除 def register(NAME, PWD, TEL): with open(‘userdate.txt‘, ‘a‘, encoding=‘utf-8‘) as f: new

兩個按鈕相關聯:改變員工級別其對應的薪資相應改變。(框架要求:SSM )

碰到一個需求: 升遷時:只允許修改僱員級別與部門編號,或新增部門,其他欄位不能修改.僱員底薪要相應改變. js介面獲取的值如下:員工級別從字典中獲取到,把級別對應的底薪用datalist顯示,往action傳的值為對應的員工級別; <tr> <td&

自興人工智慧學院發聲AI好前景但選對平臺

自興人工智慧學院發聲,AI好前景但也要選對平臺 相信各位應當都看過未來科幻電影吧,對於其中像是“天網”那樣無所不知、無所不能的人工智慧超級計算機印象頗深吧。我們現在雖然做不到這麼高階的人工智慧成品,但對於AI行業的發展,我國無疑是重視的。但對於人工智慧教育,我國卻還沒能步入正軌。 我國的人工智慧專業還只是

自興人工智能學院發聲AI好前景但選對平臺

科幻 系統 社會 現在 職責 放心 發展 興趣 美國 自興人工智能學院發聲,AI好前景但也要選對平臺 相信各位應當都看過未來科幻電影吧,對於其中像是“天網”那樣無所不知、無所不能的人工智能超級計算機印象頗深吧。我們現在雖然做不到這麽高端的人工智能成品,但對於AI行業的發展,

近半年來比特幣算力暴漲兩倍礦工寧願虧錢穩固市場地位?

Fundstrat分析師Sam Doctor表示,自今年夏天以來,比特幣算力已經增長了兩倍。Doctor指出,儘管對現有裝置進行了升級,目前新增電力消耗也達到了1GW(千兆瓦),5月份的電力消耗是5.2GW。目前比特幣挖礦的保本價格是7300美元,而5月份則是6000美元。B

985應屆生吐槽:網際網路行業疲於奔命公務員才是的生活

對於很多應屆生而言,選擇在企業工作還是做公務員,是兩種截然不同的人生道路。就像下面這名985應屆生所吐槽的一樣,選擇網際網路行業雖然錢多,但年紀一大就疲於奔命,而公務員雖然工資不高,但卻可以做到工作和生活的平衡,這才是理想中的生活。     985應屆生打算全力

985應屆生吐槽:程式設計師行業疲於奔命公務員才是的生活

對於很多應屆生而言,選擇在企業工作還是做公務員,是兩種截然不同的人生道路。就像下面這名985應屆生所吐槽的一樣,選擇網際網路行業雖然錢多,但年紀一大就疲於奔命,而公務員雖然工資不高,但卻可以做到工作和生活的平衡,這才是理想中的生活。 985應屆生打算全力備考公務員了,祝我公考成功,看著網際

即使能寫Java和SQL還是一個前端開發

down clas 瀏覽器 在服務器 cnblogs -m 數據庫 但我 工作 又到了年末,主寫Java已有半年多。在這半年的時間裏,我學會了使用Spring-Boot,學會了SQL,還學會了使用MongoDB。乍一看,我的工作內容好像大部分都是“後端”了,那我能不能算半個

【翻譯自mos文章】即使resource_limit = false password的 資源限制會生效

作用 pro use def alt doc 資源限制 lock bsp 即使resource_limit = false, password的 資源限制也會生效 參考原文: Resource limits for passwords work even with re

即使沒人註視努力成長。許多眼睛都藏在你看不見的地方!

希望 一起 單詞 發出 今天 logs 眼睛 cnblogs .com 更新一下今天的學習進度:以後每天都會更新,倘若有啥感悟想說的話也會一起發出來,希望更多的人能和我一起堅持下去:   1.每天背誦50個英文單詞,復習鞏固了52個單詞,進度: 1350/348

別人做的掃地機器人有機會想搞一臺!

分享圖片 class thread .cn images blog 機器 9.png image http://www.51hei.com/bbs/forum.php?mod=viewthread&tid=96088&extra=page%3D5&

python 1-2+3-4....99=? 這裏的題看到別人的寫法五花八門的自己寫一個

blog sta 裏的 and str 想象力 pos 問題 就是 f = ""s = ""i = 1sum = 0while i < 100:   if i %2 == 1 and i < 99:     f = "-"

12)正式卸遊戲的第一步可能是i遊戲殼(不清楚)

define end onkeydown 第一步 定時 log clas 可能 修改 1)首先是switch消息的種類的展示:    1 switch(uMsg) 2 { 3 4 case WM_CREATE://初始化 5

3星|《十大全球CEO親授企業高速成長的關鍵戰略》:作為CEO非常坦率地表明過家庭優先於工作

書評 電子版 最有 家庭 ref alt png 合集 匹配 十大全球CEO親授 企業高速成長的關鍵戰略(《哈佛商業評論》增刊) 《哈佛商業評論》上的10來篇文章合集。大部分都看過,除了一篇中信的訪談,其他大部分是美國的有點舊的案例。 總體評價3星。 以下是書中一

不知道這算不算bug了單純記錄沒別的意思圖片是上傳在慕課網的所以預覽不了。。0.0

。。 https ref 讓我 chrom ron 允許 error 個人 無意發現慕課網修改個人簽名功能性bug 修改個人簽名失敗的問題 圖片 經過測試,像這樣兩行文字中間有換行的話,保存會提示error,如圖: 圖片 而如果不換行,就能成功: 圖片 圖片 瀏覽器用的Ch