HDU Today (最短路径问题)

2024-05-26 01:08
文章标签 问题 路径 最短 hdu today

本文主要是介绍HDU Today (最短路径问题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码:

#include <string>
#include <map>
#include <iostream>
using namespace std;
#define INF 0x3fffffff
#define MAXN 10017
#define M 32
int mat[MAXN][MAXN] ,n;
#define MAX 150
map<string,int>m;
void init()
{for(int i = 0; i <= MAX; i++){for(int j = 0; j <= MAX; j++){if(i == j)mat[i][j] = 0;elsemat[i][j] = INF;}}m.clear();
}int dijkstra (int s,int f)
{//s为起点, f:为终点int dis[MAXN];//记录到任意点的最短距离int mark[MAXN];//记录被选中的结点 int i,j,k = 0;for(i = 0; i <= MAX; i++){mark[i] = 0;//初始化所有结点,每个结点都没有被选中 dis[i] = INF;}mark[s] = 1;//start结点被选中 dis[s] = 0;//将start结点的的距离设置为0 int min ;//设置最短的距离。 for(i = 1; i <= MAX; i++){k = 1;min = INF;for(j = 1; j <= MAX; j++){if(mark[j] == 0  && dis[j] < min)//未被选中的结点中,距离最短的被选中 {min = dis[j] ;k = j;}}mark[k] = 1;//标记为被选中 for(j = 1; j <= MAX; j++){if( mark[j] == 0  && (dis[j] > (dis[k] + mat[k][j])))//修改剩余结点的最短距离 {dis[j] = dis[k] + mat[k][j];}}}return dis[f];    
} int main()
{int i;char s[M], e[M], a[M], b[M];int v;while(~scanf("%d",&n)){init();if(n == -1)break;scanf("%s%s",s,e);m[s] = 1;if(!m[e])m[e] = 2;int c = 3;for(i = 0; i < n; i++){scanf("%s%s%d",a,b,&v);if(!m[a])m[a] = c++;if(!m[b])m[b] = c++;if(v < mat[m[a]][m[b]]){mat[m[a]][m[b]] = v;mat[m[b]][m[a]] = v;}}int ans = dijkstra(m[s],m[e]);if(ans == INF)printf("-1\n");elseprintf("%d\n",ans);}return 0;
}


这篇关于HDU Today (最短路径问题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1003133

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while