图论基础知识.

今天先写一些基础的图论知识;

1.floyed算法;

2.spfa算法;

3.dijkstra(迪杰斯特拉)算法;(先不写)

1.floyed算法

可以找到任意两点之间的最短路,即dis[i][j];

原理:图的传递闭包思想;时间复杂度:O(n*n*n);
 思想也比较好理解(三角形任意两边之和大于第三边嘛,如果出现不符合,就更新距离,这样比较好想)

例题oj1212
图G是一个无向连通图,没有自环,并且两点之间至多只有一条边。我们定义顶点v,u最短路径就是从v到u经过边最少的路径。所有包含在v-u的最短路径上的顶点被称为v-u的Geodetic顶点,这些顶点的集合记作I(v, u)。
我们称集合I(v, u)为一个Geodetic集合。
例如下图中,I(2, 5)={2, 3, 4, 5},I(1, 5)={1, 3, 5},I(2, 4)={2, 4}。

给定一个图G和若干点对v,u,请你分别求出I(v, u)。
输入:
 第一行两个整数n,m,分别表示图G的顶点数和边数(顶点编号1-n)
  下接m行,每行两个整数a,b表示顶点a和b之间有一条无向边。
  第m+2行有一个整数k,表示给定的点对数。
  下接k行,每行两个整数v,u。
输出:
共k行,每行对应输入文件中每一个点对v,u,按顶点编号升序输出I(v, u)。同一行的每个数之间用空格分隔。

思想:就是跑一个floyed,记录所经过的每一个点再输出就好了吧
原来看书 好像可以做一个p[i][j]数组用来储存所经过的点..
但是我做这个题的时候还不会,所以先跑了一个floyed,最后寻找如果i到k再到j的距离等于i到j的最短路,那不是很明显他在最短路上嘛,记录一个每一个k,最后输出就好这样操作比较简单;
存图用邻接矩阵就好了

#include<bits/stdc++.h>
using namespace std;
int dis[1500][1500],a[1500],n,m,t,f[1500][1500],xx,yy;
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch==‘-‘) f=-1;ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
inline void dfs()
{
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                if(dis[i][k]+dis[k][j]<=dis[i][j])
                {
                    dis[i][j]=dis[i][k]+dis[k][j];
                }
            }
}
int main()
{
    memset(dis,10,sizeof(dis));
    m=read();n=read();
    for(int i=1;i<=n;i++)
    {
        cin>>xx>>yy;
        dis[xx][yy]=1;
        dis[yy][xx]=1;
    }
//    cout<<dis[4][5]<<endl;
    dfs();
    t=read();
    int x,y;

    for(int i=1;i<=t;i++)
    {
        x=read();y=read();
        int s=0;
        a[++s]=x;
        for(int j=1;j<=n;j++)
        {
            if(dis[x][j]+dis[j][y]==dis[x][y])
            a[++s]=j;
        }
        //cout<<dis[2][4]<<‘ ‘<<dis[4][5]<<endl;
        a[++s]=y;
        sort(a+1,a+s+1);
        for(int j=1;j<=s;j++)
        {
            cout<<a[j]<<‘ ‘;
        }
        cout<<endl;
    }
    return 0;
}

2.spfa算法
关于spfa,当初听课的时候学长讲:关于spfa,它死了..

用栈来模拟,每次取出对头,判断是否需要更新,用dis数组存到任意一点的最短距离;

oj1215

农夫John发现做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。 
农夫John很狡猾。像以前的Pavlov,他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。 
农夫John知道每只奶牛都在各自喜欢的牧场(一个牧场不一定只有一头牛)。给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)

输入:

第一行: 三个数:奶牛数N,牧场数(2<=P<=800),牧场间道路数C(1<=C<=1450) 
第二行到第N+1行: 1到N头奶牛所在的牧场号 
第N+2行到第N+C+1行: 每行有三个数:相连的牧场A、B,两牧场间距离(1<=D<=255),当然,连接是双向的

输出:一行 输出奶牛必须行走的最小的距离和

#include<bits/stdc++.h>
using namespace std;
#define N 1500
int lin[N],tot;
int n,m,h,w[N],vis[N],dis[N],d[N];
int xx,yy,zz;
long long minn=100100000000000ll,ans=0;
struct gg
{
    int x,y,v;
    int next;
}a[N<<1];
inline void init(int xx,int yy,int vv)
{
    a[++tot].y=yy;
    a[tot].next=lin[xx];
    a[tot].v=vv;
    lin[xx]=tot;
}
inline void spfa(int s)
{
    memset(vis,0,sizeof(vis));
    memset(dis,257,sizeof(dis));
    queue<int> q;
    dis[s]=0;vis[s]=1;q.push(s);
    while(q.size())
    {
        int x=q.front();q.pop();
        for(int i=lin[x];i;i=a[i].next)
        {
            int v=a[i].y;
            if(dis[v]>dis[x]+a[i].v)
            {
                dis[v]=dis[x]+a[i].v;
                if(!vis[v])    vis[v]=1,q.push(v);
            }
        }
        vis[x]=0;
    }
}
int main()
{
    cin>>n>>m>>h;
    for(int i=1;i<=n;i++)
        cin>>d[i];
    for(int i=1;i<=h;i++)
    {
        cin>>xx>>yy>>zz;
        init(xx,yy,zz);
        init(yy,xx,zz);
    }
    for(int i=1;i<=m;i++)
    {
        spfa(i);ans=0;
        for(int  j=1;j<=n;j++)
            ans+=dis[d[j]];
        if(ans<minn) minn=ans;
    }
    cout<<minn;
    return 0;
}

原文地址:https://www.cnblogs.com/Tyouchie/p/10204573.html

时间: 2024-11-07 18:17:23

图论基础知识.的相关文章

图论基础知识总结

图论基础知识总结 前言 因为博主太菜,好多之前学过的图论算法都要不记得了,于是开了这篇博文提醒自己要记得复习图论. 代码 #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)-什么是图和图的分类

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

关于图算法 &amp; 图分析的基础知识概览

网址:https://learning.oreilly.com/library/view/graph-algorithms-/9781492060116/ 你肯定没有读过这本书,因为这本书的发布日期是2019年5月.本文会覆盖该书的大部分内容,读完这篇,你能够了解图算法的基本概念.关于此书,作为市面上为数不多的面向数据科学应用的图算法书籍,写的比较全面系统和易懂.当然,书在细节上的提高空间还有很多.今天内容很多,坐稳~ 目录 图算法 & 图分析 图基础知识 连通图与非连通图 未加权图与加权图 有

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

linux入门基础知识及简单命令介绍

linux入门基础知识介绍 1.计算机硬件组成介绍 计算机主要由cpu(运算器.控制器),内存,I/O,外部存储等构成. cpu主要是用来对二进制数据进行运算操作,它从内存中取出数据,然后进行相应的运算操作.不能从硬盘中直接取数据. 内存从外部存储中取出数据供cpu运存.内存的最小单位是字节(byte) 备注:由于32的cpu逻辑寻址能力最大为32内存单元.因此32位cpu可以访问的最大内存空间为:4GB,算法如下: 2^32=2^10*2^10*2^10*2^2 =1024*1024*1024

BroadcastReceive基础知识总结

BroadcastReceive基础知识总结 1.BroadcastReceive简介 BroadcastReceive也就是"广播接收者"的意思,顾名思义,就是用来接收来自系统和应用中的广播 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能,当网络状态改变时,系统会产生一条广播,接收到这条广播,就能及时的做出提示和保存数据等操作,当电池的电量改变的时候,系统会产生一条广播,接收到这条广播就能在电量低的时候告知用户

基础知识--:before伪元素和:after伪元素

http://book.51cto.com/art/201108/285688.htm 3.7  替换指定位置 大家都知道before和after是前.后的意思.但是奇怪的是,CSS中的:before伪元素和:after伪元素是为源文档中不存在的内容设置样式的. 没有内容怎么设置样式呢?别急!它们有一个content属性,一起使用就可以为某个选择器前.后的内容设置样式了. 下面就来了解一下:before伪元素和:after伪元素的用法. 视频教学:光盘/视频/3/3.7  替换指定位置.avi 

20_Shell语言———VIM编辑器基础知识三之窗口属性定制、配置文件及查找替换功能

Vim编辑器可以让用户按照需求来定制一些使用属性. 一.窗口属性定义 1)显示行号 行号不是内容,只是用来帮助用户确认文本所在的行.在vim编辑器中,如果要显示行号,可以在末行模式下输入: set number 如果想关闭,则可以在功能名称前面加上no,即: set nonumber 命令可以被简写,如set number 可以简写为 set nu:set nonumber 可以简写为 set nonu. 注意,上述设定仅对当前vim的进程有效,一旦当前进程关闭,这些设定就会失效,如果要使设定永

web基础知识(一)关于ajax传值最基础东西

HTTP方法之 GET对比POST GET:从指定的资源请求数据, POST:向指定的资源提交要被处理的数据 GET方法: 请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的: /test/demo_form.asp?name1=value1&name2=value2 有关 GET 请求的其他一些注释: GET 请求可被缓存 GET 请求保留在浏览器历史记录中 GET 请求可被收藏为书签 GET 请求不应在处理敏感数据时使用 GET 请求有长度限制 GET 请求只应当用于取回