HDU1874 畅通工程续 【链式前向星】+【Dijkstra】

来源:互联网 发布:java表名无效 编辑:程序博客网 时间:2024/05/16 19:19

畅通工程续

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 26970    Accepted Submission(s): 9719


Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
 

Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
 

Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
 

Sample Input
3 30 1 10 2 31 2 10 23 10 1 11 2
 

Sample Output
2-1

Dijkstra求最短路径的模板题。

链式前向星实现:(数据规模较小时速度比不上邻接矩阵)

#include <stdio.h>#include <string.h>#define maxn 202#define maxm 2002int head[maxn], dist[maxn];struct Node{int to, w, next;} edge[maxm];bool vis[maxn];int getNext(int n){int i, u = -1, tmp = -1;for(i = 0; i < n; ++i)if(!vis[i] && dist[i] != -1 && (dist[i] < tmp || tmp == -1)){tmp = dist[i]; u = i;}return u;}void Dijkstra(int v, int u, int n){int i, tmp;dist[v] = 0;while(v != -1){for(i = head[v]; i != -1; i = edge[i].next){if(vis[edge[i].to]) continue;tmp = dist[v] + edge[i].w;if(dist[edge[i].to] == -1 || tmp < dist[edge[i].to])dist[edge[i].to] = tmp;}vis[v] = true;v = getNext(n);if(vis[u]) return;}}int main(){int n, m, i, a, b, c;while(scanf("%d%d", &n, &m) != EOF){memset(head, -1, sizeof(head));memset(vis, 0, sizeof(vis));memset(dist, -1, sizeof(dist));for(i = 0; i < m; ++i){scanf("%d%d%d", &a, &b, &c);edge[i].to = b; edge[i].w = c;edge[i].next = head[a];head[a] = i;edge[m+i].to = a; edge[m+i].w = c;edge[m+i].next = head[b];head[b] = m + i;}scanf("%d%d", &a, &b);Dijkstra(a, b, n);printf("%d\n", dist[b]);}return 0;}


 

 

邻接矩阵实现:

#include <stdio.h>#include <string.h>#define maxn 202const int maxint = 100000000;int n, m; int dist[maxn], map[maxn][maxn];bool vis[maxn];int getNextNode(){    int i, tmp = maxint, u = -1;    for(i = 0; i < n; ++i){        if(dist[i] != -1 && !vis[i] && dist[i] < tmp){            tmp = dist[i]; u = i;        }    }    return u;}void Dijkstra(int start, int end){        memset(dist, -1, sizeof(dist));    memset(vis, 0, sizeof(vis));    int i, tmp, u;    dist[start] = 0; vis[start] = true;    for(i = 0; i < n; ++i){        if(map[start][i] != -1)             dist[i] = map[start][i];    }    u = getNextNode();    while(u != -1){        for(i = 0; i < n; ++i){            if(map[u][i] != -1 && !vis[i]){                tmp = dist[u] + map[u][i];                if(dist[i] == -1 || dist[i] > tmp)                    dist[i] = tmp;            }                        }        vis[u] = true;                u = getNextNode();    }}int main(){    int i, a, b, x, s, t;    while(scanf("%d%d", &n, &m) != EOF){          memset(map, -1, sizeof(map));              for(i = 0; i < m; ++i){            scanf("%d%d%d", &a, &b, &x);            if(map[a][b] != -1 && x > map[a][b])                continue;            map[a][b] = map[b][a] = x;        }        scanf("%d%d", &s, &t);        Dijkstra(s, t);        printf("%d\n", dist[t]);    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩读英语绘本大人不会翻译怎么办 东西掉到手刹缝里面了怎么办 泰拉瑞亚猩红之地蔓延到家里怎么办 三星r.467玩dnf闪退怎么办 美团外卖不小心撞到汽车怎么办 如果你在战场上遇到华裔美军怎么办 衣服洗完了干了后发黄怎么办 毛衣起球怎么办学会这几个小妙招 小车没电了打不着火怎么办 老婆花钱大手大脚又要我给钱怎么办 住酒店手机id被劫持了怎么办 孩子老是送玩具给别的小朋友怎么办 老板总想和我谈人生怎么办gl 导师让用师姐的数据写论文怎么办 签了平面模特协议想违约怎么办 福州96年以前社保手册丢了怎么办 被老师缴的手机弄没了怎么办 户口在成都医保在德阳生孩子怎么办 微课掌上通看不到孩子班级圈怎么办 微课掌上通的录音错误是怎么办 微课视频录制ppt里面音乐怎么办 老师在街上和别人吵起来了怎么办 手机录屏传到爱剪辑变成竖屏怎么办 尔雅通识课程考试忘记做了怎么办 尔雅通识课过了课程完成时间怎么办 微信账号没冻结登录不了怎么办 微信解封电话号码没有电话号怎么办 ps中智能对象不能直接编辑怎么办 工资低奖金高银行流水不够怎么办 我水费交了自来水公司不给开怎么办 艺考文化分数差4分二本怎么办 学信网手机号换了密码忘记了怎么办 自考毕业证学信网上查不到怎么办 苹果手机自带浏览器证书过期怎么办 手机连接工行证书介质失贩怎么办 老公要带与小三生的孩子回家怎么办 小三怀孕打胎后还是很爱老公怎么办 小三怀孕开不到引产证明怎么办 如何处理老公和小三有了孩子怎么办 老公出轨回归后还和小三联系怎么办 丈夫出轨想挽回这段婚姻该怎么办