热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图论小系统

将自己学的知识整合了一下,弄了个小的图论系统。有关知识请看:http:blog.csdn.netcolumndetailstulun.html#include#i

将自己学的知识整合了一下,弄了个小的图论系统。

有关知识请看:http://blog.csdn.net/column/details/tulun.html

#include 
#include 
#include 
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const   int oo=1e9;/**oo 表示无穷大*/
const  int mm=1111111;/**mm 表示边的最大数量,记住要是原图的两倍,在加边的时候都是双向的*/
const  int mn=2010;/**mn 表示点的最大数量*/
int head[mn];
int ip;
int n,m;///n个点,m条边
int rd[mn],rdd[mn];///入度
int cd[mn];///出度
int dd[999][999],dist[mn];///任意两点距离
struct data
{
    int to,w,next;
} tu[mm];
void init()///初始化
{
    ip=0;
    memset(head,-1,sizeof(head));
    memset(cd,0,sizeof(cd));
    memset(rd,0,sizeof(rd));
    memset(rdd,0,sizeof(rdd));
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            dd[i][j]=i==j?0:oo;
}
void add(int u,int v,int w)///添加边
{
    tu[ip].w=w,tu[ip].to=v,tu[ip].next=head[u],head[u]=ip++;
}
void input(int flag)///图的输入
{
    cout<>a>>b>>c;
        while(a<1||a>n||b<1||b>n)
        {
            cout<<"请重新输入正确的顶点!!(1到"<>a>>b>>c;
        }
        if(flag)
            add(a,b,c);
        else
            add(a,b,c),add(b,a,c);
        rd[b]++;
        rdd[b]++;
        cd[a]++;
    }
    cout<<"建图完成!正在跳转…………"<>ss;
        while(ss<1||ss>n)
        {
            cout<<"请重新输入1到"<>ss;
        }
        cout<<"请输入第二个点";
        cin>>ee;
        while(ee<1||ee>n)
        {
            cout<<"请重新输入1到"<>ee;
        }
        if(ss!=ee)
        {
            if(dd[ss][ee]>s;
        while(s<0||s>n)
        {
            cout<<"请重新输入1到"<>s;
        }
        if(s==0)break;
        queueq;
        for(int i=0; i<=n; i++)
            dist[i]=oo;
        int vis[mn]= {0};
        q.push(s);
        dist[s]=0;
        while(!q.empty())
        {
            int h=q.front();
            q.pop();
            vis[h]=0;
            for(int i=head[h]; i!=-1; i=tu[i].next)
            {
                int v=tu[i].to;
                int w=tu[i].w;
                if (dist[v]>dist[h]+w)
                {
                    dist[v]=dist[h]+w;
                    if (!vis[v])
                    {
                        vis[v]=1;
                        q.push(v);
                    }
                }
            }
        }
        for(int i=1; i<=n; i++)
            if(i!=s)
            {
                if(dist[i]>=oo)
                    cout< scc[mn];///得出来的缩点,scc[i]里面存i这个缩点具体缩了哪些点
stack S;
void dfs(int u)
{
    dfn[u] = low[u] = ++step;
    S.push(u);
    for (int i = head[u]; i !=-1; i=tu[i].next)
    {
        int v = tu[i].to;
        if (!dfn[v])
        {
            dfs(v);
            low[u] = min(low[u], low[v]);
        }
        else if (!sccno[v])
            low[u] = min(low[u], dfn[v]);
    }
    if (low[u] == dfn[u])
    {
        scc_cnt += 1;
        scc[scc_cnt].clear();
        while(1)
        {
            int x = S.top();
            S.pop();
            if (sccno[x] != scc_cnt) scc[scc_cnt].push_back(x);
            sccno[x] = scc_cnt;
            if (x == u) break;
        }
    }
}
void tarjan()
{
    system("cls");
    for(int i=0; i<=n; i++)
        scc[i].clear();
    memset(sccno, 0, sizeof(sccno));
    memset(dfn, 0, sizeof(dfn));
    step = scc_cnt = 0;
    for (int i = 1; i <=n; i++)
        if (!dfn[i]) dfs(i);
    cout<<"该图的强连通分量有"<=0; j=tu[j].next)
            cout<"<q;
    int flag=0;
    for(int i=1; i<=n; i++)
        if(!rdd[i])
            q.push(i),flag=1;
    if(!flag)
    {
        cout<<"该有向图形成了环,无法进行拓扑排序"<=0; i=tu[i].next)
        {
            int to=tu[i].to;
            rdd[to]--;
            if(!rdd[to])
            {
                q.push(to);
            }
        }
    }
    cout<=0; i=nex[i])
            if(flow[i]&&dis[v=ver[i]]<0)
            {
                dis[q[r++]=v]=dis[u]+1;
                if(v==dest)  return 1;
            }
    return 0;
}
int Dinic_dfs(  int u, int exp)
{
    if(u==dest)  return exp;
    for(  int &i=work[u],v,tmp; i>=0; i=nex[i])
        if(flow[i]&&dis[v=ver[i]]==dis[u]+1&&(tmp=Dinic_dfs(v,min(exp,flow[i])))>0)
        {
            flow[i]-=tmp;
            flow[i^1]+=tmp;
            return tmp;
        }
    return 0;
}
int Dinic_flow()
{
    int i,ret=0,delta;
    while(Dinic_bfs())
    {
        for(i=0; i>tt)
        {
            while(tt<0||tt>6)
            {
                cout<<"请重新输入0到6之间的数字!!"<>tt;
            }
            if(!tt)
                return;
            else if(tt==1)
                bianli();
            else if(tt==2)
                topu();
            else if(tt==3)
                Dinic();
            else if(tt==4)
            {
                floyd();
                break;
            }
            else if(tt==5)
            {
                spfa();
                break;
            }
            else
            {
                tarjan();
                break;
            }
        }
    }
}
void wushow()///展示无向图功能
{
    cout<<"1.无向图的遍历"<ss;
    ss.push(1);
    while(!ss.empty())
    {
        int x=ss.top();
        cout<q;
    q.push(1);
    while(!q.empty())
    {
        int x=q.front();
        cout<>tt;
        while(tt>2||tt<0)
        {
            cout<<"请重新输入0到2!!"<>tt;
        }
        if(tt==1)
            wsbianli();
        else if(tt==2)
            wgbianli();
        else
            break;
    }
}
struct tree
{
    int a,b,w;
    void sett(int x,int y,int z)
    {
        a=x,b=y,w=z;
    }
} ttu[mm];
bool cmp(tree a,tree b)
{
    return a.w"<>tt)
        {
            while(tt<0||tt>5)
            {
                cout<<"请重新输入0到5之间的数字!!"<>tt;
            }
            if(!tt)
                return;
            else if(tt==1)
            {
                wbianli();
                break;
            }
            else if(tt==2)
            {
                floyd();
                break;
            }
            else if(tt==3)
            {
                spfa();
                break;
            }
            else if(tt==4)
            {
                mintree();
                break;
            }
            else
            {
                tarjan();
                break;
            }
        }
    }
}
int main()
{
    while(1)
    {
        system("cls");
        cout<<"----------这是一个图论小系统----------"<>n;
        if(!n)break;
        cout<<"请输入要建图的边数:";
        cin>>m;
        cout<<"正在跳转…………"<>tt)
        {
            if(tt==1)
            {
                youxiangtu();
                system("cls");
                break;
            }
            else if(tt==2)
            {
                wuxiangtu();
                break;
            }
            else if(tt==0)
            {
                system("cls");
                break;
            }
            cout<<"请输入0,1,2!"<


图论小系统


推荐阅读
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • Appium + Java 自动化测试中处理页面空白区域点击问题
    在进行移动应用自动化测试时,有时会遇到某些页面没有返回按钮,只能通过点击空白区域返回的情况。本文将探讨如何在Appium + Java环境中有效解决此类问题,并提供详细的解决方案。 ... [详细]
  • 如何清除Chrome浏览器地址栏的特定历史记录
    在使用Chrome浏览器时,你可能会发现地址栏保存了大量浏览记录。有时你可能希望删除某些特定的历史记录而不影响其他数据。本文将详细介绍如何单独删除地址栏中的特定记录以及批量清除所有历史记录的方法。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 探索新一代API文档工具,告别Swagger的繁琐
    对于后端开发者而言,编写和维护API文档既繁琐又不可或缺。本文将介绍一款全新的API文档工具,帮助团队更高效地协作,简化API文档生成流程。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • 本文介绍了如何通过Java代码计算一个整数的位数,并展示了多个基础编程示例,包括求和、平均分计算、条件判断等。 ... [详细]
  • 本篇文章介绍如何将两个分别表示整数的链表进行相加,并生成一个新的链表。每个链表节点包含0到9的数值,如9-3-7和6-3相加得到1-0-0-0。通过反向处理链表、逐位相加并处理进位,最终再将结果链表反向,即可完成计算。 ... [详细]
  • 本文探讨了C++编程中理解代码执行期间复杂度的挑战,特别是编译器在程序运行时生成额外指令以确保对象构造、内存管理、类型转换及临时对象创建的安全性。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
author-avatar
518094haha
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有