动态规划综合+图论基础

今天zkj大佬来讲课,一晚上有一个这么强的PPT太学了!
那么我们步入正题,首先看到图论:

图论

例题1:lg1144

很简单,我们直接bfs(因为边权都是1,也就是无权图)求路径数就可以了.

#include<bits/stdc++.h>
using namespace std;
const int maxm=2000010,maxn=1000010,Inf=2147483647;
const int Mod=100003;
struct node{
    int to,next;
}e[maxm*2];
int front[maxn],cnt;
int ans[maxn],dis[maxn],vis[maxn];
void Add(int x,int y){
    e[++cnt].to=y;
    e[cnt].next=front[x];
    front[x]=cnt;
}
int main(){
    int i,j,k,n,m;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        dis[i]=Inf;
    for(i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        Add(x,y);Add(y,x);
    }
    queue<int >Q;
    while(!Q.empty())Q.pop();
    Q.push(1);
    ans[1]=1;vis[1]=1;
    while(!Q.empty()){
        int u=Q.front();
        Q.pop();
        vis[u]=0;
        for(int i=front[u];i;i=e[i].next){
            int v=e[i].to;
            if(dis[v]>dis[u]+1){
                dis[v]=dis[u]+1;
                ans[v]=ans[u];
                if(!vis[v]){
                    vis[v]=1;Q.push(v);
                }
            }
            else if(dis[v]==dis[u]+1)
                ans[v]=(ans[v]+ans[u])%Mod;
        }
    }
    ans[1]=1;
    for(i=1;i<=n;i++)
        printf("%d\n",ans[i]%Mod);
    return 0;
}
/*
Input:
5 7
1 2
1 3
2 4
3 4
2 3
4 5
4 5

Output:
1
1
1
2
4
*/ 

例题2:lg1137
原题

#include<bits/stdc++.h>
using namespace std;
const int maxm=200010,maxn=100010;
struct node{
    int to,next;
}e[maxm];
int front[maxn],cnt;
int vis[maxn],dis[maxn];
void Add(int u,int v){
    e[++cnt].to=v;
    e[cnt].next=front[u];
    front[u]=cnt;
}
int ans[maxn];
int dfs(int u,int fa){
    if(ans[u])return ans[u];
    ans[u]=1;
    for(int i=front[u];i;i=e[i].next){
        int v=e[i].to;
        if(v==fa)continue;
        dfs(v,u);
        ans[u]=max(ans[u],ans[v]+1);
    }
    return ans[u];
}
int main(){
    int i,j,k,n,m;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        Add(y,x);
    }
    for(i=1;i<=n;i++)
        printf("%d\n",dfs(i,i));
    return 0;
}
/*
Input:
5 6
1 2
1 3
2 3
2 4
3 4
2 5

Output:
1
2
3
4
3
*/ 

DP:

例题1:lg1880 石子合并
原题

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
const int Inf=2147483647,maxn=1010;
int a[2*maxn],sum[2*maxn];
int dp1[maxn*2][maxn*2],dp2[maxn*2][maxn*2];
int main(){
    int i,j,k,n,m;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        a[i+n]=a[i];
    }
    for(i=1;i<=2*n;i++)
        sum[i]=sum[i-1]+a[i];
    for(i=2*n-1;i>=1;i--)
        for(j=i+1;j<i+n;j++){
            dp1[i][j]=Inf;
            for(k=i;k<j;k++){
                dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]);
                dp2[i][j]=max(dp2[i][j],dp2[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);
            }
        }
    int ans1=Inf,ans2=0;
    for(i=1;i<=n;i++){
        ans1=min(ans1,dp1[i][i+n-1]);
        ans2=max(ans2,dp2[i][i+n-1]);
    }
    printf("%d\n%d\n",ans1,ans2);
    return 0;
} 

原文地址:https://www.cnblogs.com/cj-gjh/p/8150111.html

时间: 2024-08-13 18:08:01

动态规划综合+图论基础的相关文章

数据结构:图论基础

图概述 图(Graph)是一种比线性结构和树形结构都要复杂的数据结构.简单讲,图是由表示数据元素的的集合V和表示数据之间关系的集合E组成.其中,数据元素常称作顶点(vertex),数据之间的关系常称作边(edge).故图可记为G=<V,E>,其中V是顶点的有穷非空集合,E是边的集合.在图中顶点的前驱和后继是不设限制的,因此图描述的是一种网状关系. 无向图 若边是无序的或者说是无向的,则称此图是无向图.若无向图中有边(v1,v2)(无向图中边用圆括号表示),则显然(v2,v1)和(v1,v2)是

图论基础知识总结

图论基础知识总结 前言 因为博主太菜,好多之前学过的图论算法都要不记得了,于是开了这篇博文提醒自己要记得复习图论. 代码 #include<bits/stdc++.h> using namespace std; #define gc() getchar() inline int In(){ char c=gc(); int x=0,ft=1; for(;c<'0'||c>'9';c=gc()) if(c=='-') ft=-1; for(;c>='0'&&c&

图论基础知识.

今天先写一些基础的图论知识: 1.floyed算法: 2.spfa算法: 3.dijkstra(迪杰斯特拉)算法:(先不写) 1.floyed算法 可以找到任意两点之间的最短路,即dis[i][j]: 原理:图的传递闭包思想:时间复杂度:O(n*n*n); 思想也比较好理解(三角形任意两边之和大于第三边嘛,如果出现不符合,就更新距离,这样比较好想) 例题oj1212图G是一个无向连通图,没有自环,并且两点之间至多只有一条边.我们定义顶点v,u最短路径就是从v到u经过边最少的路径.所有包含在v-u

图论基础——邻接链表存图+拓扑排序

邻接链表存图,在这里其实是用数组进行模拟的 又叫做链式存储法,本来是要用链表实现的,但大多数情况下只需要用数组模拟即可 例: u(边的起点) v(边的终点) w(边的权值) 4 2 1 1 2 3 1 4 1 1 5 2 4 3 4 2 3 1 话不多说,直接上代码 for(int i=1;i<=m;i++) { scanf("%d%d%d",&u1,&v1,&w1); e[i].u =u1;//赋给第i条边的起点 e[i].v =v1;//赋给第i条边的

图论基础知识(1)-什么是图和图的分类

emmm......蒟蒻的第一篇博客,先讲一个比较简单的东西来熟悉以下操作吧(还是怕自己翻车) 由于本人知识水平有限,暂时不会涉及相关数学知识,这篇博客主要还是提供个人对图论的比较感性的认识 这篇文章将要介绍: 图的基本定义 图的简单分类 一些简单术语的解释 因为本人比较蒻,所以这篇博客会讲的非常慢,dalao们可以绕步了... Part1 什么是图: 这是百度百科里面给出的解释,很重要的一条就是:“这种图形通常是用来描述某些事物之间的某种特定关系”,也就是说图实际上存储的是一些关系,所以说以下

图论基础及相关练习

图论起源于著名的哥尼斯堡七桥问题.大家应该都了解过这个故事.

图论基础——最短路算法集锦

最短路算法有个基础——————松弛操作(在大多数最短路算法都会涉及) if(d[e[i].v]>d[e[i].u]+w[i])//如果这条边的终点到源点的距离大于起点到源点距离,就替换. { d[e[i].v]>d[e[i].u]+w[i]; } 最短路算法一共有多少种方法我不知道,在这里我只想记录4种: •Dijkstra:求单源点最短路(不含负边权) •Bellman-ford:求单源点最短路(可含负边权) •SPFA(使用队列优化后的Bellman-ford) •Floyd:求各点间的最

并查集 - 图论基础

2017-07-25 22:18:16 writer:pprp 定义:(来源于搜狗百科)并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 作用:用来判断两个节点是否属于同一颗树: 操作:1,查找,Find    2,合并,Merge #include <iostream> using namespace std; int parent[1000]; int Find(int x) { if(parent[x] == x

图论基础学习

//zjnu 1410//floyed #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define inf 0x3fffffff int mp[201][201],n; void floyed() { int i,j,k,mi=inf; for(i=0;i<n;i++) { for(j=0;j<n;j+