【算法提高——第三讲(一)】图论(3)

简介: 【算法提高——第三讲(一)】图论(3)

3.6 最小生成树的扩展应用

3.6.1 1146. 新的开始

image.png


代码:


#include<bits/stdc++.h>
using namespace std;
const int N=310,M=100010;
int n,m;
int p[N];
int money[N];
struct Edge{
    int a,b,w;
}edges[M];
bool cmp(Edge a,Edge b)
{
    return a.w<b.w;
}
int findP(int x)
{
    if(p[x]!=x) return p[x]=findP(p[x]);
    return p[x];
}
int kruskal()
{
    sort(edges,edges+m,cmp);
    for(int i=1;i<=n+1;i++) p[i]=i;
    int res=0;
    for(int i=0;i<m;i++)
    {
        int a=edges[i].a,b=edges[i].b,w=edges[i].w;
        a=findP(a),b=findP(b);
        if(a!=b)
        {
            p[a]=b;
            res+=w;
        }
    }
    return res;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>money[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            int w;
            cin>>w;
            if(i<j)
            {
                edges[m].a=i,edges[m].b=j,edges[m].w=w;
                m++;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        edges[m].a=n+1,edges[m].b=i,edges[m].w=money[i];
        m++;
    }
    cout<<kruskal();
    return 0;
}

3.6.2 1145. 北极通讯网络

image.png


代码:


#include
using namespace std;
typedef pair PII;
const int N=510,M=250010;
int n,m,k;
int p[N];
PII mp[N];
struct Edge{
    int a,b;
    double w;
}edges[M];
bool cmp(Edge a,Edge b)
{
    return a.w
}
int findP(int x)
{
    if(p[x]!=x) return p[x]=findP(p[x]);
    return p[x];
}
int check()
{
    set st;
    for(int i=1;i<=n;i++)
    {
        st.insert(findP(i));
    }
    return st.size();
}
double kruskal()
{
    sort(edges,edges+m,cmp);
    for(int i=1;i<=n;i++) p[i]=i;
    double res=0;
    for(int i=0;i
    {
        int a=edges[i].a,b=edges[i].b;
        double w=edges[i].w;
        a=findP(a),b=findP(b);
        if(a!=b)
        {
            p[a]=b;
            res=w;
        }
        if(check()<=k)
            break;
    }
    return res;
}
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        int x,y;
        cin>>x>>y;
        mp[i]=make_pair(x,y);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            double x1=mp[i].first,y1=mp[i].second,x2=mp[j].first,y2=mp[j].second;
            double w=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
            edges[m].a=i,edges[m].b=j,edges[m].w=w;
            m++;
        }
    }
    printf("%.2f",kruskal());
    return 0;
}
1

3.6.3 346. 走廊泼水节

image.png


代码:


#include
using namespace std;
typedef pair PII;
const int N=6010,M=6010;
int T,n,m;
int p[N],sz[N];
map mp;
struct Edge{
    int a,b,w;
}edges[M];
bool cmp(Edge a,Edge b)
{
    return a.w
}
int findP(int x)
{
    if(p[x]!=x) return p[x]=findP(p[x]);
    return p[x];
}
int kruskal()
{
    sort(edges,edges+m,cmp);
    for(int i=1;i<=n;i++)
    {
        p[i]=i;
        sz[i]=1;
    }
    int res=0;
    for(int i=0;i
    {
        int a=edges[i].a,b=edges[i].b,w=edges[i].w;
        a=findP(a),b=findP(b);
        if(a!=b)
        {
            res+=(sz[a]*sz[b]-1)*(w+1);
            sz[b]+=sz[a];
            p[a]=b;
        }
    }
    return res;
}
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n;
        for(int i=0;i
        {
            int a,b,w;
            cin>>a>>b>>w;
            edges[i].a=a,edges[i].b=b,edges[i].w=w;
        }
        m=n-1;
        cout<
    }
    return 0;
}

3.6.4 1148. 秘密的牛奶运输

image.png


代码:


#include
using namespace std;
typedef long long LL;
const int N=510,M=10010;
const LL INF=1e18;
int n,m;
int p[N];
int dis1[N][N],dis2[N][N];
int h[N],e[N*2],w[N*2],ne[N*2],idx;
struct Edge{
    int a,b,w;
    bool type;
}edges[M];
bool cmp(Edge a,Edge b)
{
    return a.w
}
void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int findP(int x)
{
    if(p[x]!=x) return p[x]=findP(p[x]);
    return p[x];
}
void dfs(int u,int fa,int maxd1,int maxd2,int d1[],int d2[])
{
    d1[u]=maxd1,d2[u]=maxd2;
    for(int i=h[u];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(j!=fa)
        {
            int td1=maxd1,td2=maxd2;
            if(w[i]>td1) td2=td1,td1=w[i];
            else if(w[i]td2) td2=w[i];
            dfs(j,u,td1,td2,d1,d2);
        }
    }
}
LL kruskal()
{
    sort(edges,edges+m,cmp);
    for(int i=1;i<=n;i++) p[i]=i;
    LL res=0;
    for(int i=0;i
    {
        int a=edges[i].a,b=edges[i].b,w=edges[i].w;
        int pa=findP(a),pb=findP(b);
        if(pa!=pb)
        {
            p[pa]=pb;
            add(a,b,w),add(b,a,w);
            edges[i].type=true;
            res+=w;
        }
    }
    return res;
}
int main()
{
    memset(h,-1,sizeof h);
    cin>>n>>m;
    for(int i=0;i
    {
        cin>>edges[i].a>>edges[i].b>>edges[i].w;
    }
    LL sum=kruskal();
    for(int i=1;i<=n;i++)
        dfs(i,-1,-1e9,-1e9,dis1[i],dis2[i]);
    LL res=INF;
    for(int i=0;i
    {
        if(!edges[i].type)
        {
            int a=edges[i].a,b=edges[i].b,w=edges[i].w;
            if(w>dis1[a][b])
            {
                res=min(res,sum+w-dis1[a][b]);
            }
            else if(w>dis2[a][b])
            {
                res=min(res,sum+w-dis2[a][b]);
            }
        }
    }
    cout<
    return 0;
}


相关文章
|
6月前
|
机器学习/深度学习 安全 算法
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
|
6月前
|
算法 测试技术 C++
【动态规划】【图论】【C++算法】1575统计所有可行路径
【动态规划】【图论】【C++算法】1575统计所有可行路径
|
存储 算法 索引
数据结构与算法之图论及其相关算法
图的基本介绍 线性表局限于一个直接前驱和一个直接后继的关系,树也只能有一个直接前驱也就是父节点,当我们需要表示多对多的关系时, 这里我们就用到了图。 图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图: 简单来说,图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为:G(V,E),其中,G 表示一个图,V 表示顶点的集合,E 表示边的集合。 然后我们说说图中的一些常见概念: 节点(Vertex):图中的基本元素,用于表示某个实体。 边(Edge):连接两个节点的线段,用于表示节点之间的关系。 度(Degree):
54 0
|
6月前
|
算法 测试技术 C++
【动态规划】【图论】【C++算法】1928规定时间内到达终点的最小花费
【动态规划】【图论】【C++算法】1928规定时间内到达终点的最小花费
|
12月前
|
算法 存储 内存技术
【AcWing算法基础课】第三章 搜索与图论(2)
特点:尽可能先向纵深方向搜索。使用stack实现。所需空间O(h)(h为深度)。不具有“最短性”。
79 0
【AcWing算法基础课】第三章 搜索与图论(2)
|
5月前
|
算法 数据挖掘 定位技术
算法必备数学基础:图论方法由浅入深实践与应用
算法必备数学基础:图论方法由浅入深实践与应用
|
6月前
|
算法 C++
一题带你写出图论算法模板!!!
一题带你写出图论算法模板!!!
|
6月前
|
算法 搜索推荐 Python
Python高级数据结构——图论算法(Graph Algorithms)
Python高级数据结构——图论算法(Graph Algorithms)
155 0
|
6月前
|
算法 C++ NoSQL
|
6月前
|
存储 算法 定位技术
图论算法dijkstra dfs bfs以及动态规划
图论算法dijkstra dfs bfs以及动态规划
79 0