当前位置: 首页 > news >正文

【BZOJ4006】管道连接(动态规划,斯坦纳树)

题面

BZOJ
洛谷

题解

和这题区别不是很大吧。
基本上拿过来改一下就做完了。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define MAX 1100
inline int read()
{
    int x=0;bool t=false;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=true,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return t?-x:x;
}
int n,m,p;
struct Line{int v,next,w;}e[MAX<<3];
int h[MAX],cnt=1;
inline void Add(int u,int v,int w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}
int f[1<<10][MAX],g[1<<10];
bool vis[MAX];
queue<int> Q;
map<int,int> M;
int fz[MAX],St[20],G[20];
void SPFA(int *f)
{
    while(!Q.empty())
    {
        int u=Q.front();Q.pop();
        for(int i=h[u];i;i=e[i].next)
            if(f[e[i].v]>f[u]+e[i].w)
            {
                f[e[i].v]=f[u]+e[i].w;
                if(!vis[e[i].v])Q.push(e[i].v),vis[e[i].v]=true;
            }
        vis[u]=false;
    }
}
bool check(int s)
{
    for(int i=1;i<=p;++i)
        if((s&G[i])!=0&&(s&G[i])!=G[i])
            return false;
    return true;
}
int main()
{
    n=read();m=read();p=read();
    memset(f,63,sizeof(f));memset(g,63,sizeof(g));
    for(int i=1;i<=m;++i)
    {
        int u=read(),v=read(),w=read();
        Add(u,v,w);Add(v,u,w);
    }
    for(int i=1;i<=p;++i)
    {
        int c=read(),d=read();
        fz[d]=c;M[d]=i-1;St[i]=d;
        f[1<<(i-1)][d]=0;
    }
    for(int i=1;i<=p;++i)
        for(int j=1;j<=p;++j)
            if(fz[St[i]]==fz[St[j]])
                G[i]|=1<<M[St[j]];
    int S=1<<p;
    for(int i=0;i<S;++i)
    {
        for(int j=1;j<=n;++j)
        {
            for(int k=i&(i-1);k;k=(k-1)&i)
                f[i][j]=min(f[i][j],f[k][j]+f[i^k][j]);
            if(f[i][j]<=1e9)Q.push(j),vis[j]=true;
        }
        SPFA(f[i]);
        for(int j=1;j<=n;++j)g[i]=min(g[i],f[i][j]);
    }
    for(int i=0;i<S;++i)
        for(int t=(i-1)&i;t;t=(t-1)&i)
            if(check(t)&&check(i^t))
                g[i]=min(g[i],g[t]+g[i^t]);
    printf("%d\n",g[S-1]<=1e9?g[S-1]:-1);
    return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/9670137.html

相关文章:

  • 9-18 一次编程面试
  • python学习之路——作业 day6(18/9/18)
  • Kotlin基础学习笔记 (三)
  • 表管理
  • 《手把手教你学DSP-基于TMS320F28335》书中的错误
  • rxjs - 创建数据流
  • Visual-UIElement-FrameworkElement,带来更多功能的同时也带来了更多的限制
  • 源码探究Java_HashMap
  • python-第一个程序
  • 【cs231n】神经网络学习笔记3
  • 实验吧 看起来有点难(手工注入加sqlmap注入)
  • 转: CSS3 @media 用法总结
  • Python_configparser模块
  • js 中的几个假值
  • Asp.Net MVC中Action跳转小结
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 「面试题」如何实现一个圣杯布局?
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java读取Properties文件的六种方法
  • spring学习第二天
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 目录与文件属性:编写ls
  • 排序算法之--选择排序
  • 前端攻城师
  • 深度解析利用ES6进行Promise封装总结
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一、python与pycharm的安装
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 1.Ext JS 建立web开发工程
  • 我们雇佣了一只大猴子...
  • ​ArcGIS Pro 如何批量删除字段
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​学习一下,什么是预包装食品?​
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (2020)Java后端开发----(面试题和笔试题)
  • (AngularJS)Angular 控制器之间通信初探
  • (function(){})()的分步解析
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)关于pipe()的详细解析
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET Remoting学习笔记(三)信道
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET分布式缓存Memcached从入门到实战
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BJDCTF2020]The mystery of ip
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [Django开源学习 1]django-vue-admin
  • [English]英语积累本