您的位置:首页 > 产品设计 > UI/UE

hdu--2544--题如其名<最短路>--dij<priority_queue>||spfa<queue>

2014-08-19 14:42 531 查看
这题 让我深刻地 感受到了 题如其名 =-= .........

一直以来都写spfa 这次 也顺便写了下 dij<链式前向星&&priority_queue> 代码太长了..

但是 要是思路清晰的话 写下去的感觉很爽的...

当然 我还是更加喜欢 spfa

关于 链式前向星 可以---传送--出产地学习

关于 spfa -- 我没找到特别出色的介绍<我也写过..> 这个不难 你可以随便去找一篇来学习

关于 dij -- 也是图论的入门重要算法 介绍它的博客实在太多了... 但是 使用优先队列版本的dij 没见过详细介绍的

但 既然都是优化了 你只要明白了 dij的算法思想 你就能看懂我下面的优先队列来优化的写法---自己写heap 效率更高 但我还不会=-=-----

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

int n;
const int inf = 0x3f3f3f3f;
const int size = 110;
struct graph
{
int num;
int next[size*10];
int dist[size*10];
}node[size];
bool vis[size];
int dist[size];

void init( )
{
for( int i = 0 ; i<size ; i++ )
{
node[i].num = 0;
}
memset( vis , false , sizeof(vis) );
}

void spfa( )
{
queue<int>q;
while( !q.empty() )
q.pop();
q.push(1);
vis[1] = true;
for( int i = 0 ; i<=n ; i++ )
{
dist[i] = i==1 ? 0 : inf;
}
while( !q.empty() )
{
int now = q.front();
q.pop();
vis[now] = false;
for( int i = 0 ; i<node[now].num ; i++ )
{
if( dist[now] + node[now].dist[i] < dist[ node[now].next[i] ] )
{
dist[ node[now].next[i] ] = dist[now] + node[now].dist[i];
if( !vis[ node[now].next[i] ] )
{
vis[ node[now].next[i] ] = true;
q.push( node[now].next[i] );
}
}
}
}
}

int main()
{
int m , st , end , cost;
while( cin >> n >> m &&(n||m) )
{
init( );
while( m-- )
{
cin >> st >> end >> cost;
node[st].next[ node[st].num ] = end;
node[st].dist[ node[st].num++ ] = cost;
node[end].next[ node[end].num ] = st;
node[end].dist[ node[end].num++ ] = cost;
}
spfa( );
cout << dist
<< endl;
}
return 0;
}


View Code

虽说 spfa 不稳定 可能会出现故意数据来卡它 ... 有必要这么 丧病吗#78....

这2个 完全可以当做模板吧... 只要你会了思想 就能自己手写出来了 到时候 也就自然而然会形成自己的风格-.-

today:

  这是最好的时代 这是最坏的时代

  这是智慧的时代 这是愚蠢的时代

  这是信仰的时期   这是怀疑的时期

  这是光明的季节     这是黑暗的季节

  这是希望之春      这是失望之冬

  人们面前有着各样事物  人们面前一无所有

  人们正在直登天堂    人们正在直下地狱

  ---------------------------------------------------------now?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: