数据结构实验之图论七:驴友计划

题目描述

做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。

输入

连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。 

输出

在同一行中输出路径长度和收费总额,数据间用空格间隔。 

示例输入

1
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

示例输出

3 40

提示




#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef struct node
{
    int l;//高速公路的长度;
    int c;//收费额;
}node;
node a[501][501];//两城市间是否有关系;
node dis[501];
int visit[501];//标记数组;
int n,m,s,d;
void low_dis_m()//找最短路径,最少花费;
{
    visit[s]=1;//起点开始;
    int min,i,j,k,u;
    for(i=0;i<n-1;i++)
    {
        min=inf;
        for(j=0;j<n;j++)//找邻接点的最小路径;
        {
            if(!visit[j]&&min>dis[j].l)
            {
                min=dis[j].l;
                u=j;
            }
        }
        visit[u]=1;
        for(k=0;k<n;k++)
        {
            if(a[u][k].l<inf)//u到k之间有公路;
            {
                if(dis[k].l>dis[u].l+a[u][k].l||((dis[k].l==dis[u].l+a[u][k].l)&&(dis[k].c>dis[u].c+a[u][k].c)))
                    //找最短路径,如果路径相等,则找最小花费;
                    {dis[k].l=dis[u].l+a[u][k].l;
                    dis[k].c=dis[u].c+a[u][k].c;
                    }
            }
        }
    }
    printf("%d %d\n",dis[d].l,dis[d].c);//输出到目标城市的最小距离,最小花费;


}
int main()
{
    int t,v1,v2,i,j,w,z;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,inf,sizeof(a));//注意初始化a数组为无穷大;
        memset(visit,0,sizeof(visit));
        memset(dis,0,sizeof(dis));
        scanf("%d %d %d %d",&n,&m,&s,&d);
        for(i=0;i<n;i++)
                for(j=0;j<n;j++)
        {
            if(i==j)
            {
                a[i][j].l=a[i][j].c=0;
            }
        }
              for(i=1;i<=m;i++)
        {
            scanf("%d %d",&v1,&v2);
            scanf("%d %d",&w,&z);
            a[v1][v2].l=a[v2][v1].l=w;
            a[v1][v2].c=a[v2][v1].c=z;
        }
        for(i=0;i<n;i++)
        {
            dis[i].l=a[s][i].l;//城市间的距离关系;
            dis[i].c=a[s][i].c;//城市间的收费关系;
        }
        low_dis_m();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows完成端口(IOCP)

http://blog.csdn.net/piggyxp/article/details/6922277

图结构练习——最小生成树

题目描述 有n个城市&#xff0c;其中有些城市之间可以修建公路&#xff0c;修建不同的公路费用是不同的。现在我们想知道&#xff0c;最少花多少钱修公路可以将所有的城市连在一起&#xff0c;使在任意一城市出发&#xff0c;可以到达其他任意的城市。 输入 输入包含多组数据&a…

Windows 中_T和L

_T("")是一个宏&#xff0c;定义于tchar.h下。[1]&#xfeff; #define _T(x) _ _T(x)   #ifdef _UNICODE #define _ _T(x) L ## x #else /* ndef _UNICODE */ #define _ _T(x) x 他的作用是让你的程序支持Unicode编码 因为Windows使用两种字符集ANSI和UN…

多线程笔记补充之线程通信wait和notify方法以及Lock和Condition接口的使用

线程通信-wait和notify方法介绍: java.lang.Object类提供类两类用于操作线程通信的方法. wait():执行该方法的线程对象释放同步锁,JVM把该线程存放到等待池中,等待其他的线程唤醒该线程. notify:执行该方法的线程唤醒在等待池中等待的任意一个线程,把线程转到锁池中等待. notif…

数据结构实验之图论六:村村通公路

题目描述 当前农村公路建设正如火如荼的展开&#xff0c;某乡镇政府决定实现村村通公路&#xff0c;工程师现有各个村落之间的原始道路统计数据表&#xff0c;表中列出了各村之间可以建设公路的若干条道路的成本&#xff0c;你的任务是根据给出的数据表&#xff0c;求使得每个村…

技术人生“白天求生存,晚上谋发展”

白天求生存&#xff0c;晚上谋发展 这句话最近在团队经常有人说&#xff0c;其实我也深有体会&#xff0c;因为我看到的技术牛人他们背后肯定有一段很长时间的艰苦时光&#xff0c;可能是3年&#xff0c;也可能是8年&#xff0c;也可能一直还在坚持。 其实我们周围大部份人有一…

CRT

当C Runtime函数库于20世纪70年代产生出来时&#xff0c;PC的内存容量还很小,多任务是个新奇观念&#xff0c;更别提什么多线程了。因此以当时产品为基础所演化的C Runtime函数库在多线程&#xff08;multithreaded&#xff09;的表现上有严重问题&#xff0c;无法被多线程程序…

java多线程笔记补充之线程的生命周期

多线程通信的时候很容易造成死锁,死锁无法解决,只能避免: 当A线程等待由B线程持有的锁,而B线程正在等待A线程持有的锁时,发生死锁现象,JVM不检测也不试图避免这种情况,所以程序员必须保证不导致死锁. 避免死锁法则: 当多个线程都要访问共享的资源A,B,C时,保证每一个线程都按照…

图结构练习——BFSDFS——判断可达性

题目描述 在古老的魔兽传说中&#xff0c;有两个军团&#xff0c;一个叫天灾&#xff0c;一个叫近卫。在他们所在的地域&#xff0c;有n个隘口&#xff0c;编号为1..n&#xff0c;某些隘口之间是有通道连接的。其中近卫军团在1号隘口&#xff0c;天灾军团在n号隘口。某一天&…

关于跨dll的模板单例问题

C的模板可以帮助我们编写适合不同类型的模板类&#xff0c;给代码的复用性提供了极大的方便。近来写了一个涉及单例的C模板类&#xff0c;简化下来可以归结为以下的代码&#xff1a; 1234567891011template <typename T>class Singleton{public:// 此处省去了多线程安全锁…

java多线程笔记补充之 线程控制操作

线程休眠:让执行的线程暂停一段时间&#xff0c;进入计时等待状态。 方法:staticvoid sleep(long millis) 调用sleep后&#xff0c;当前线程放弃CPU,在指定时间段之内&#xff0c;sleep所在线程不会获得执行的机会。 此状态下的线程不会释放同步锁/同步监听器. 该方法更多的用…

图结构练习——BFS——从起始点到目标点的最短步数

题目描述 在古老的魔兽传说中&#xff0c;有两个军团&#xff0c;一个叫天灾&#xff0c;一个叫近卫。在他们所在的地域&#xff0c;有n个隘口&#xff0c;编号为1..n&#xff0c;某些隘口之间是有通道连接的。其中近卫军团在1号隘口&#xff0c;天灾军团在n号隘口。某一天&…

C++中的Dll内存问题

这两天在做一个数据结构&#xff0c;使用树结构&#xff0c;两层&#xff0c;第一层的数据元素为第二层的n个分支 遇到问题如下&#xff1a; 1&#xff1a;使用vector在debug下运行正常&#xff0c;在release下源码运行正常封装后运行失败 请教了多人&#xff0c;觉得可能是vec…

Catch That Cow

题目描述 Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John ha…

java5新特性静态引用、foreach、自动装箱和泛型枚举以及可变参数的总结

静态引用 导入(import)表示去找哪一个类&#xff0c;去哪一个包下去找哪些被使用到的类。 在java中有一个语言核心包&#xff1a;java.lang. 使用java.lang包中的API&#xff0c;不需要引用&#xff0c;直接能找到&#xff0c;但是&#xff0c;如果我们使用到的API不呼吁java.l…

C++中堆和栈的完全解析

C中堆和栈的完全解析 内存分配方面&#xff1a; 堆&#xff1a; 操作系统有一个记录空闲内存地址的链表&#xff0c;当系统收到程序的申请时&#xff0c;会遍历该链表&#xff0c;寻找第一个空间大于所申请空间的堆结点&#xff0c;然后将该结点从空闲结点链表中删 除&#xff…

数据结构实验之图论四:迷宫探索

题目描述 有一个地下迷宫&#xff0c;它的通道都是直的&#xff0c;而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关&#xff1b;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点&#xff1f;输入 连续T组数据输入&#xff0c;每组数据第一行给出三个正整数&am…

心灵的旅行

http://wzrong.blog.163.com/blog/static/1326445772012214295364/ --心灵的旅行&#xff08;陈科儒&#xff09; http://www.qixingquan.com/article-143060-1.html --神山的召唤 http://www.qixingquan.com/thread-78730-1-1.html --一个人的远方&#xff0c;独行滇西北

java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量

一提到java是一种什么语言&#xff1f; 大多数人肯定异口同声的说是一门面向对象的语言&#xff0c;这种观点从我们开始学java就已经根深蒂固了&#xff0c;但是学到java8新特性函数式编程的时候&#xff0c;我才知道java并不是纯面向对象的语言。 lambda表达式的详细教程 lam…