【树DP】【基环树】[ZJOI2008][HYSBZ/BZOJ1040]骑士

            题目链接

            分析

            看穿题目

            如果一个骑士痛恨另一个骑士,就在两个骑士直接连接一条无向边。题目就是要求图中的最大权值独立集。

            实现方法

            如果这道题的图是一棵树(或森林)的话,显然可以用树形动态规划解决。
            f(u) 表示以u为根的子树中的最大权值的独立集,令 s(u)=vuvf(v) gs(u)=vuvf(v)

            f(u)=max(s(u),gs(u)+wt(u))

            但是这道题的图并不是树,那怎么办呢?

            这道题的图中,每一个连通块一定是“基环树”,即每个连通块有且只有一个环(边数=点数)。

            那对于每个连通块,我们只需要找出环,然后在环上随意切掉一条边,这个连通块就成为了一棵树,可以做树dp了。
            显然,这条边连接的两个点是不能同时被选择的,怎么限制这个条件呢?
            我们只需要对这个连通块做两次dp,以这两个点为分别根,且强制不选择为根的那个点即可。

            代码

            #include<cstdio>
            #include<cstring>
            #include<algorithm>
            using namespace std;
            #define MAXN 1000000
            int wt[MAXN+10],fa[MAXN+10],n,st,ed,fa2[MAXN+10];
            long long ans,gs[MAXN+10],s[MAXN+10],f[MAXN+10];
            bool vis[MAXN+10];
            struct node{
                int v;
                bool f,vis;
                node *next,*back;
            }edge[MAXN*2+10],*adj[MAXN+10],*ecnt=&edge[0],*cut;
            void addedge(int u,int v){
                node *p=++ecnt;
                p->v=v;
                p->next=adj[u];
                adj[u]=p;
                p=p->back=++ecnt;
                p->v=u;
                p->next=adj[v];
                adj[v]=p;
                p->back=ecnt-1;
            }
            void Read(int &x){
                char c;
                while((c=getchar())&&c!=EOF)
                    if(c>='0'&&c<='9'){
                        x=c-'0';
                        while((c=getchar())&&c>='0'&&c<='9')
                            x=x*10+c-'0';
                        ungetc(c,stdin);
                        return;
                    }
            }
            void read(){
                int t;
                Read(n);
                for(int i=1;i<=n;i++){
                    Read(wt[i]),Read(t);
                    addedge(i,t);
                }
            }
            void dfs(int u){
                vis[u]=1;
                for(node *p=adj[u];p;p=p->next){
                    if(!p->vis){
                        p->vis=p->back->vis=1;
                        if(vis[p->v]){
                            st=p->v,ed=u;
                            cut=p;
                            continue;
                        }
                        fa[p->v]=u;
                        dfs(p->v);
                    }
                }
            }
            void dfs2(int u){
                gs[u]=s[u]=0;
                for(node *p=adj[u];p;p=p->next)
                    if(!p->f&&p->v!=fa2[u]){
                        fa2[p->v]=u;
                        dfs2(p->v);
                    }
                f[u]=max(gs[u]+wt[u],s[u]);
                s[fa2[u]]+=f[u];
                gs[fa2[fa2[u]]]+=f[u];
            }
            void solve(){
                int i;
                long long mx;
                for(i=1;i<=n;i++){
                    mx=0;
                    if(!vis[i]){
                        dfs(i);
                        cut->f=cut->back->f=1;
                        fa2[st]=0;
                        dfs2(st);
                        mx=max(mx,s[st]);
                        fa2[ed]=0;
                        dfs2(ed);
                        mx=max(mx,s[ed]);
                        cut->f=cut->back->f=0;
                    }
                    ans+=mx;
                }
            }
            int main()
            {
                read();
                solve();
                printf("%lld\n",ans);
            }
            相关文章
            相关标签/搜索
            管家婆精选心水资料中特网 荆门市| 类乌齐县| 江都市| 子洲县| 如皋市| 洛阳市| 施甸县| 麟游县| 商水县| 东宁县| 西畴县| 台前县| 门头沟区| 西乌珠穆沁旗| 宁德市| 宝鸡市| 山西省| 镶黄旗| 界首市| 寻乌县| 邵武市| 临沂市| 赤峰市| 册亨县| 甘孜县| 葫芦岛市| 壤塘县| 静乐县| 大安市| 红河县| 修文县| 天祝| 广州市| 建水县| 美姑县| 汤阴县| 镇平县| 潜山县| 赞皇县| 日照市| 舟曲县| 常山县| 剑阁县| 邹城市| 额敏县| 昌江| 嘉善县| 孝感市| 江城| 专栏| 双牌县| 罗定市| 耒阳市| 南康市| 墨脱县| 齐河县| 玛曲县| 周口市| 贡山| 谷城县| 柞水县| 寻甸| 曲靖市| 泽库县| 石柱| 滁州市| 方正县| 保亭| 东海县| 德格县| 青阳县| 霸州市| 哈密市| 绥滨县| 庆阳市| 临西县| 大石桥市| 门源| 东宁县| 青冈县| 宁安市| 尚义县| 辽宁省| 塔城市| 寿光市| 青阳县| 曲沃县| 蒙山县| 金华市| 通化市| 连平县| 永川市| 福贡县| 故城县| 克东县| 虎林市| 海盐县| 长兴县| 威海市| 石台县| 忻州市| 增城市| 呼伦贝尔市| 西贡区| 枣庄市| 姜堰市| 杂多县| 宁阳县| 西安市| 广西| 五指山市| 华宁县| 西安市| 绥江县| 马尔康县| 鄂托克前旗| 海安县| 尼木县| 闵行区| 从江县| 邢台县| 晴隆县| 内丘县| 永川市| 中西区| 长白| 鹤庆县| 牡丹江市| 闽侯县| 南召县| 清新县| 苍山县| 盐城市| 双柏县| 长葛市| 武强县| 博白县| 扶风县| 扎赉特旗| 静安区| 佛山市| 泸水县| 阿瓦提县| 景洪市| 普兰县| 施甸县| 邻水| 读书| 溧阳市| 博兴县| 崇礼县| 水富县| 曲阜市| 肃南| 仁布县| 吉林市| 咸丰县| 措勤县| 台南市| 高尔夫| 中牟县| 万山特区| 文昌市| 无为县| 桐庐县| 阜城县| 武强县| 湟源县| 会宁县| 平顶山市| 新晃| 米泉市| 龙州县| 塔城市| 遂昌县| 益阳市| 隆安县| 曲水县| 边坝县| 康定县| 盐亭县| 三门峡市| 永新县| 沁水县| 隆德县| 项城市| 类乌齐县| 集安市| 米脂县| 建德市| 华坪县| 沧源| 北流市| 旺苍县| 印江| 忻城县| 彭州市| 陆河县| 西峡县| 姜堰市| 桃园市| 原阳县| 鄂托克前旗| 康马县| 温州市| 江津市| 兴隆县| 崇左市| 灌云县| 普安县| 宣汉县| 隆回县| 兴宁市| 江孜县| 防城港市| 婺源县| 南汇区| 河曲县| 雷波县| 新巴尔虎左旗| 乌什县| 仙居县| 息烽县| 阿克陶县| 辽源市| 金乡县| 阳朔县| 赫章县| 富源县| 岳池县| 祥云县| 曲阳县| 唐山市| 综艺| 成武县| 铁岭县| 花莲县| 若尔盖县| 靖宇县| 宣汉县| 冀州市| 花垣县| 辽宁省| 新郑市| 北海市| 冕宁县| 永寿县| 尼勒克县| 江城| 华坪县| 尼木县| 西昌市| 德化县| 陈巴尔虎旗| 垣曲县| 措美县| 鄂托克旗| 上思县| 保德县| 浙江省| 监利县| 洱源县| 连南| 东丽区| 龙游县| 吉水县| 扶绥县| 汨罗市| 郁南县| 潍坊市| 铜陵市| 深泽县| 甘孜县| 宣城市| 和龙市| 甘德县| 厦门市| 基隆市| 万年县| 商洛市| 汉阴县| 阳泉市| 五寨县| 台中县| 平顺县| 广西| 德钦县| 北碚区| 十堰市| 滕州市| 鹤岗市| 航空| 泰顺县| 塔河县| 贵阳市| 南宫市| 高青县| 静海县| 宜春市| 新宾| 都兰县| 安多县| 巴青县| 项城市| 宜昌市| 宁安市| 云和县| 新竹市| 沙湾县| 泌阳县| 昌图县| 翁源县| 泽州县| 桂东县| 车险| 扬中市| 阳东县| 九龙县| 雷州市| 星座| 册亨县| 晴隆县| 大邑县| 慈利县| 辽宁省| 和硕县| 南华县| 建宁县| 江都市| 南投县| 南昌市| 茂名市| 山阴县| 孟津县| 镇远县| 禄丰县| 滦南县| 尼木县| 神木县| 潼关县| 庄浪县| 华容县| 蚌埠市| 呼和浩特市| 昆山市| 叶城县| 长汀县| 黔西县| 嘉义市| 富裕县| 黄平县| 双江| 顺平县| 义乌市| 台江县| 平顶山市| 定陶县| 嵊州市| 张北县| 时尚| 固始县| 无极县| 株洲市| 原平市| 洞口县| 托克托县| 张家界市| 敦煌市| 辛集市| 平阴县| 湘阴县| 北流市| 揭西县| 波密县| 观塘区| 乌什县| 札达县| 和平县| 莱西市| 淮北市| 都安| 上杭县| 邢台市| 贵港市| 开鲁县| 广元市| 天祝| 泸水县| 盐池县| 翼城县| 忻州市| 宁河县| 霍州市| 新沂市| 北宁市| 承德县| 江口县| 成武县| 普兰店市| 崇文区| 藁城市| 赤水市| 林口县| 永福县| 安西县| 吐鲁番市| 衡水市| 临汾市| 正蓝旗| 内丘县| 阿克| 天全县| 博罗县| 墨竹工卡县| 柏乡县| 靖江市| 临城县| 鹤山市| 五大连池市| 武强县| 小金县| 枣强县| 临武县| 延寿县| 涪陵区| 兴仁县| 卓尼县| 汾西县| 墨玉县| 黄大仙区| 临沧市| 西丰县| 石家庄市| 镇坪县| 大新县| 长海县| 龙里县| 高碑店市| 南川市| 昔阳县| 云阳县| 阜平县| 林口县| 钟祥市| 西吉县| 皮山县| 宜兴市| 宜丰县| 南阳市| 梁平县| 金川县| 丹棱县| 德阳市| 进贤县| 霍州市| 留坝县| 上高县| 双江| 于都县| 腾冲县| 文水县| 新田县| 宿迁市| 邹平县| 金乡县| 博罗县| 南投县| 东光县| 高平市| 库尔勒市| 舟曲县| 宜宾县| 恩平市| 博白县| 定陶县| 威宁| 武平县| 安多县| 丰城市| 玛沁县| 齐齐哈尔市| 东乡| 北海市| 罗平县| 内江市| 西和县| 万全县| 长宁区| 涟水县| 河津市| 韩城市| 广州市| 铁力市| 体育| 黑水县| 青州市| 勃利县| 简阳市| 平乡县| 滁州市| 汕尾市| 富川| 融水| 阿克苏市| 苗栗县| 特克斯县| 白水县| 中江县| 青阳县| 普陀区| 读书| 宜良县| 德惠市| 苍溪县| 手游| 壶关县| 井冈山市| 乐至县| 满城县| 满洲里市| 西华县| 贵州省| 黔江区| 江津市| 云浮市| 潢川县| 陆川县| 龙川县| 宁德市| 托克逊县| 保靖县| 农安县| 巴塘县| 集贤县| 宝坻区| 连城县| 濮阳市| 马关县| 兴海县| 文水县| 东阳市| 东明县| 焦作市| 泰宁县| 凉城县| 北京市| 武功县| 怀化市| 垦利县| 曲周县| 台江县| 巴彦淖尔市| 和静县| 原平市| 垦利县| 盐亭县| 大宁县| 兴化市| 海城市| 太仓市| 江永县| 武宣县| 宜州市| 大丰市| 绥化市| 健康| 平远县| 白城市| 互助| 镇赉县| 丰原市| 蕲春县| 彭水| 凉城县| 尤溪县| 六安市| 兴山县| 乌兰察布市| 巫溪县| 黄大仙区| 高雄县| 留坝县| 年辖:市辖区| 甘谷县| 宜川县| 蓝山县| 抚顺县| 张家界市| 齐齐哈尔市| 望江县| 神木县| 如皋市| 东方市| 尚义县| 讷河市| 松溪县| 张家界市| 玉门市| 榆社县| 金平| 林芝县| 汝城县| 永春县| 闻喜县| 鸡泽县| 增城市| 牡丹江市| 寻甸| 浦江县| 陆良县| 五台县| 湄潭县| 旅游| 花莲县| 江源县| http://wap.uwlozv.fit http://m.scgtts.fit http://wap.dwwtmh.fit http://m.erselg.fit http://tmhrcj.fit http://m.qtoecf.fit http://www.drgwmf.fit http://wap.svaebc.fit http://www.uhvgzh.fit http://wap.creevd.fit http://m.tszaxt.fit http://wap.qprpvp.fit http://bopeqo.fit http://m.hsbore.fit http://wap.spuxat.fit http://m.sgfrnf.fit http://jhhugs.fit http://m.wbkmou.fit