• 知识点扫盲加基本板子总结


    知识点扫盲加基本板子总结

    数据结构

    并查集

    #include<bits/stdc++.h>
    #define N 105
    using namespace std;
    int fa[N];
    int n;
    int find(int x)
    {
        if (x==fa[x]) return x; else return (fa[x]=find(fa[x]));
    }
    void merge(int x,int y)
    {
        int fx=find(x),fy=find(y);
        if (fx!=fy) fa[fx]=fy;
    }
    void init()
    {   scanf("%d",&n);
        for (int i=1; i<=n; i++) fa[i]=i;
    }
    int main()
    {
        return 0;
    }
    
    

    图论

    Floyd

    题目链接['http://codeforces.com/contest/296/problem/D']

    #include<bits/stdc++.h>
    #define N 505
    #define ll long long
    #define inf 100000000000000LL
    using namespace std;
    int n;
    int b[N];
    ll f[N][N],ans[N];
    bool vis[N];
    void init()
    {
        scanf("%d",&n);
        for (int i=1; i<=n; i++)
        {
            for (int j=1; j<=n; j++) scanf("%lld",&f[i][j]);
        }
        for (int i=1; i<=n; i++) scanf("%d",&b[i]);
    
    }
    void floyd()
    {
        for (int i=n; i>=1; i--)
        {
            vis[b[i]]=1;
    
            for (int j=1; j<=n; j++)
                for (int k=1; k<=n; k++)
                {
                    f[j][k]=min(f[j][k],f[j][b[i]]+f[b[i]][k]);
                }
            ll sum=0;
            for (int j=1; j<=n; j++)
                for (int k=1; k<=n; k++)
                {
                    if (!vis[j] || !vis[k]) continue;
                    sum+=f[j][k];
                }
            ans[i]=sum;
        }
    }
    void print()
    {
        for (int i=1; i<=n; i++) printf("%lld ",ans[i]);
    }
    int main()
    {
        init();
        floyd();
        print();
        return 0;
    }
    

    堆优化Dijkstra

    题目链接['http://codeforces.com/contest/20/problem/C']

    #include<bits/stdc++.h>
    #define N 100005
    #define M 100005
    #define inf 100000000000000000LL
    #define ll long long
    using namespace std;
    int n,m,st,ed;
    ll dis[N];
    ll path[N];
    bool vis[N];
    vector<pair<ll,ll> >E[M+10];
    priority_queue<pair<ll,ll> > Q;
    void insedge(int u,int v,ll val)
    {
        E[u].push_back(make_pair(v,val));
    }
    void init()
    {
        scanf("%d%d",&n,&m);
        for (int i=1; i<=m; i++)
        {
            int u,v;
            ll val;
            scanf("%d%d%lld",&u,&v,&val);
            insedge(u,v,val);
            insedge(v,u,val);
        }
        st=1; ed=n;
        for (int i=1; i<=n; i++) dis[i]=inf;
        dis[st]=0;
    }
    void  dijkstra()
    {
        Q.push(make_pair(dis[st],st));
        while (!Q.empty())
        {
            int  v=Q.top().second;
            ll val=-Q.top().first;
            Q.pop();
            if (val!=dis[v]) continue;
            if (vis[v]) continue;
            vis[v]=1;
            for (int i=0; i<E[v].size(); i++)
            {
                int u=E[v][i].first;
                ll cost=E[v][i].second;
                if (dis[u]>dis[v]+cost)
                {
                    dis[u]=dis[v]+cost;
                    path[u]=v;
                    Q.push(make_pair(-dis[u],u));
                }
            }
    
        }
    }
    void dfs(int x)
    {
        if (x!=st) dfs(path[x]);
        printf("%d ",x);
    }
    void print()
    {
        if (dis[ed]==inf) printf("-1
    ");
        else
        {
            int x=ed;
            dfs(x);
        }
    }
    int main()
    {
        init();
        dijkstra();
        print();
        return 0;
    }
    
    

    SPFA

    题目链接['http://codeforces.com/contest/20/problem/C']

    #include<bits/stdc++.h>
    #define mp(a,b) make_pair(a,b)
    #define ll long long
    #define inf 100000000000000000LL
    #define N 200005
    using namespace std;
    vector<pair<int,ll> > E[N];
    int path[N];
    ll dis[N];
    queue<int>q;
    bool vis[N];
    int n,m;
    void insedge(int u,int v,ll val)
    {
        E[u].push_back(mp(v,val));
    }
    void spfa()
    {
        q.push(1);
        while (!q.empty())
        {
            int u=q.front(); q.pop();
            vis[u]=0;
            for (int i=0; i<E[u].size(); i++)
            {
                int v=E[u][i].first;
                ll cost=E[u][i].second;
                if (dis[v]>dis[u]+cost)
                {
                    dis[v]=dis[u]+cost; path[v]=u;
                    if (dis[v]>dis[n]) continue;
                    if (!vis[v])
                    {
                        q.push(v); vis[v]=1;
                    }
                }
            }
        }
    }
    void init()
    {
        scanf("%d%d",&n,&m);
        for (int i=1; i<=m; i++)
        {
            int u,v; ll val;
            scanf("%d%d%lld",&u,&v,&val);
            insedge(u,v,val); insedge(v,u,val);
        }
        for (int i=1; i<=n; i++) dis[i]=inf;
        dis[1]=0;
    }
    void dfs(int x)
    {
        if (x!=1) dfs(path[x]);
        printf("%d ",x);
    }
    void print()
    {
        if (dis[n]==inf) printf("-1
    ");
        else
        {
            int x=n;
            dfs(x);
        }
    }
    int main()
    {
        init();
        spfa();
        print();
        return 0;
    }
    
    

    最小生成树Kruskal

    题目链接['http://acm.hdu.edu.cn/showproblem.php?pid=1863']

    #include<bits/stdc++.h>
    #define N 100005
    #define ll long long
    using namespace std;
    int n,m;
    int fa[N];
    struct Edge
    {
        int u,v; long long val;
        operator < ( Edge a){
            return this->val<a.val;
        }
    }a[N];
    int find(int x)
    {
        if (x==fa[x]) return x; else return (fa[x]=find(fa[x]));
    }
    int  merge(int x,int y)
    {
        int fx=find(x),fy=find(y);
        if (fx!=fy)
        {
            fa[fx]=fy; return 1;
        }
        return 0;
    }
    int main()
    {
        while (scanf("%d%d",&n,&m)!=EOF)
        {
            if (n==0 ) break;
            for (int i=1; i<=n; i++)
                scanf("%d%d%lld",&a[i].u,&a[i].v,&a[i].val);
            sort(a+1,a+n+1);
            //for (int i=1; i<=n; i++)
               // cout<<a[i].u<<" "<<a[i].v<<" "<<a[i].val<<endl;
            int sum=0; ll ans=0;
            for (int i=0; i<=m; i++) fa[i]=i;
            for (int i=1; i<=n; i++)
            {
                int flag=merge(a[i].u,a[i].v);
                if (flag==1) sum++,ans+=a[i].val;
              //  if (sum==m-1) break;
            }
            if (sum!=(m-1)) printf("?
    ");
            else printf("%lld
    ",ans);
        }
    
        return 0;
    }
    
    

    最小生成树prim算法

    题目链接[]

    
    

  • 相关阅读:
    [php]php设计模式 Command(命令模式)
    [php]php设计模式 Observer(观察者模式)
    [转]Ubuntu 系统安装极点五笔
    [转] 关于开源协议
    上传大小限制设置
    php开启安全模式后禁用的函数
    [php]php设计模式 Template (模板模式)
    [php]php设计模式 Singleton(单例模式)
    [php]php设计模式 Strategy(策略模式)
    [转]调优您的 LAMP 应用程序的 5 种简单方法
  • 原文地址:https://www.cnblogs.com/HQHQ/p/10874380.html
Copyright © 2020-2023  润新知