poj2387(Dijkstra)
这题直接用Dijkstra算法就行了,没什么难度。要注意T是路径数,N是顶点数,别弄反了。可能会有重边的情况不过,不过我用的邻接表,没什么影响。
代码
//Menory 412k Time 110ms
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
int T,N;
class road
{public:int end;int weight;
};
class Graph
{public:int v;vector<road> *adj;int *mark;Graph(int n);~Graph();void addEdge(int s,int e,int w);
};
Graph::Graph(int n)
{v=n;adj=new vector<road>[n];mark=new int[n];for(int i=0;i<n;i++)mark[i]=0;
}
Graph::~Graph()
{delete []mark;delete []adj;
}
void Graph::addEdge(int s,int e,int w)
{road r;r.end=e;r.weight=w;adj[s].push_back(r);r.end=s;r.weight=w;adj[e].push_back(r);
}
class Dist
{public:int index;int length;int pre;friend bool operator<(const Dist & a,const Dist &b){return a.length>b.length;}
};
void Dijkstra(Graph & g,int s)
{Dist *D = new Dist[g.v];for(int i=0;i<g.v;i++){D[i].index = i;D[i].length=2147483647;D[i].pre = s;}D[s].length = 0;priority_queue<Dist> aqueue;aqueue.push(D[s]);for(int i=0;i<g.v;i++){Dist d;bool FOUND;FOUND=false;while(!aqueue.empty()){d=aqueue.top();aqueue.pop();if(g.mark[d.index]==0){FOUND=true;break;}}if(!FOUND)break;g.mark[d.index]=1;int node=d.index;vector<road>::iterator ii=g.adj[node].begin();for(;ii!=g.adj[node].end();ii++){if( D[ii->end].length> D[node].length + ii->weight){D[ii->end].length = D[node].length + ii->weight;D[ii->end].pre=node;aqueue.push(D[ii->end]);}}}cout<<D[0].length<<endl; //输出结果
}
int main()
{int a1,a2,a3;cin>>T>>N;Graph g(5000);for(int i=1;i<=T;i++){cin>>a1>>a2>>a3;g.addEdge(a1-1,a2-1,a3); //题目是从1开始,顶点减一从0开始}Dijkstra(g,N-1);
}
poj2387(Dijkstra)相关推荐
- POJ2387 Til the Cows Come Home -DIJKSTRA 练习
题目大意是:有N个牛棚和T条边相连,每条边有个权值,问1号到N号牛棚之间的最短距离 本题是又是DIJKSTRA最短路水题,注意任何两个牛棚之间可能有多条路相连,输入时先输入边,再输入点,程序如下: # ...
- POJ-2387:Dijkstra模板题
题目链接 AC代码: #include <stdio.h> #include <string.h> #include <string> #include <i ...
- [C] Dijkstra算法——通过边实现松弛
Dijkstra算法--通过边实现松弛 本算法学习指定一个点(源点)到其余各个顶点的最短路径,也叫做单源最短路径例如求下图1号顶点到2,3,4,5,6号顶点的最短路径 这个时候你可能就要问了,为什么不 ...
- Codeforces.1051F.The Shortest Statement(最短路Dijkstra)
题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...
- 经典算法研究系列:二、Dijkstra 算法初探
经典算法研究系列:二.Dijkstra 算法初探 July 二零一一年一月 ====================== 本文主要参考:算法导论 第二版.维基百科. 写的不好之处,还望见谅. 本 ...
- 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...
问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...
- Acwing--朴素dijkstra
#include <iostream> #include <cstring> using namespace std;/* 优点:可以求得[n]到任一点的最短距离;可以输入最短 ...
- Dijkstra(迪杰斯特拉)算法简介
目录 适用情形 思想 核心代码 设计实现更多功能 举例说明 适用情形 适用于权值为非负的图的单源最短路径 思想 在已知起点与终点的情况下.须有三个一维数组S,U,dis,S用于记录已经查找过的点,U则 ...
- 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...
- 最短路径 - dijkstra
dijkstra是单源点最短路算法. 借图: 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合.一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知. 初始时,S中仅含有源.设u是G的 ...
最新文章
- 《程序员面试金典》合法括号判断
- 一份干货满满的PPT,答辩加分手到擒来!
- 《数据中台:让数据用起来》读书笔记
- Log4j2使用总结
- 严格对角占优矩阵特征值_电子科技大学矩阵理论复习笔记 第四章 特征值的估计...
- Postman 如何处理上一个接口返回值作为下一个接口入参?
- AlphaGo围棋 论文笔记
- 2020年华为鲲鹏产业体系研究深度报告
- 在系统编程ISP及在应用编程IAP
- FreeSWITCH对接MRCP Server
- Linux系统故障-MBR(主引导记录)被破坏的解决方法
- iOS下载APP之后直接跳转到信任界面
- kk_想要学习的知识
- 常用电源管理稳压IC
- python 偏态分布_峰度与偏度(python)
- c语言while输入n求n个奇数,任意输入n个整数,输出这n个数中的奇数个数和偶数个数.用while语句...
- 微信分享功能填坑过程
- 520表白html,html5 canvas全屏的520爱心表白网页代码
- 《orecal 数据库中文排序》
- Winbox配置PPPOE的参数