前言
博客里前面几篇文章已经介绍了 这两个算法的原理问题(floyd算法比较简单 而且制约性比较大 这里 就先从重要的开始) 这里 我们由原理转向应用!
当然这个问题背景是非常简单的 简单的问题 运用熟练了 在比较困难的问题下稍作转化
就可以游刃有余的解决了!
后续 我会不断完善这套代码
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=2544
AC代码
这其中有两个函数 一个是用堆优化的Djkstra算法 和Bellman-Ford 算法 数据都是以邻接表结构存储的
一直在用邻接矩阵 转换为邻接表 刚开始 还真有那么点混乱 但是理清了 这个数据结构之间的关系就OK了
解题思路
这个题其实任何一种算法都可以做出来 只是我们在这做一个优化 为了 这个代码能够解决更多的题目
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int maxp=100+10;
const int maxl=20000+10;
const int inf = 1e7;
int mark[maxp];
int minway[maxp];
int n,m;
//ps: 当时在写这个结构体的时候 遇到了 很多问题 花了很长时间才解决的!
//自定义结构体 point
重载了 < 运算符 和= 运算符 便于 我们能够可以直接给point 对象直接赋值和 比较大小
这个小于其实是优先队列里面需要用到的
struct point
{
int v;
int w;
point(int v,int w):v(v),w(w)
{
;
}
void operator =(const point& a)
{
//return point(a.v,a.w);?aê2?′?ò??μ??y??ê???μ?
v=a.v;
w=a.w;
}
bool operator <(const point &a)const
{
return w>a.w;
}
};
//定义邻接表 二维的!
//当然也可以 这样定义 vector<point> map[maxp];
//但是 这一种速度 慢于 下面这一种 具体原因 县不解释 orz(我也是看文章上说的 回来再验证)
vector<vector<point> > map;
void dijkstra()//
{
//初始化
map.resize(maxp);
for(int i=0;i<maxp;i++)
{
mark[i]=0;
minway[i]=inf;
}
map.clear();
point temp(1,1);
//优先队列 一定要用一次初始化 !!!
//因为优先队列 没有清空函数 只能自己pop() 或者直接定义一个新的!
//就是这样一个 初始化问题 耗费了 我七八个小时!!!
priority_queue<point> pq;
pq.push(point(1,0));//加入 源点
while(!pq.empty())
{
temp=pq.top();
pq.pop();
if(mark[temp.v])
continue;
mark[temp.v]=1;
minway[temp.v]=temp.w;
for(int i=0;i<map[temp.v].size();i++)
{
int v= map[temp.v][i].v;
int w= map[temp.v][i].w;
if(mark[v])
continue;
if(minway[v]>temp.w+w)
{
minway[v]=temp.w+map[temp.v][i].w;
pq.push(point(v,minway[v]));
}
}
}
}
void bellman_ford()
{
minway[1]=0;
for(int j=1;j<n;j++)
for(int i=1;i<=n;i++)
{
for(int k=0;k<map[i].size();k++)
{
int v=map[i][k].v;
int w=map[i][k].w;
if(minway[i]<inf)
{
minway[v]=min(minway[v],minway[i]+w);
}
}
}
}
void floyd()
{
//因为这一种 比较不适合 用邻接表 我就没写
}
int main()
{
//freopen("C:\\Users\\12893\\Desktop\\in.txt","r",stdin);
point temp(1,1);
while(1)
{
cin>>n>>m;
if(n==0||m==0)
return 0;
map.resize(maxp);
for(int i=1;i<maxp;i++)
{
mark[i]=0;
minway[i]=inf;
}
map.clear();
while(m--)
{
int x,y,w;
cin>>x>>y>>w;
map[x].push_back(point(y,w));
map[y].push_back(point(x,w));
}
bellman_ford();
cout<<minway[n]<<endl;
}
return 0;
}