这题作为模板题,解法好多...

最近周围的人都在搞图论阿,感觉我好辣鸡,只会跟风学习。

暂时只有SPFA和Dijkstra的

SPFA (邻接表版。也可以写成临接矩阵存图,但题目可能给出平行边的,所以要注意找最小的边储存,还要注意判断一个点是否多次进入队列)老实说觉得SPFA好像只是被队列优化过的ford一样的..

 #include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <utility>
#include <vector>
#include <queue>
#define MAXX 10010
using namespace std; const int N = ;
const int INF = 0x3f3f3f3f; typedef struct sion
{
int dis;
int nxp;
}sion; int dic[N];
bool vis[N];
vector<sion>li[N]; int spfa(int &s, int &t)
{
queue<int>q;
q.push(s);
vis[s] = ;
dic[s] = ;
while(!q.empty())
{
int pre = q.front();
q.pop();
for(int i = ; i < li[pre].size(); i++)
{
// cout << dic[li[pre][i].nxp] << "~";
if(dic[li[pre][i].nxp] > dic[pre] + li[pre][i].dis)
{
dic[li[pre][i].nxp] = dic[pre] + li[pre][i].dis;
q.push(li[pre][i].nxp);
// cout << dic[li[pre][i].nxp] << "!";
}
} }
return dic[t];
} void init()
{
memset(vis,false,sizeof(vis));
memset(dic,INF,sizeof(dic));
for(int i = ; i < N; i++)
li[i].clear();
return ;
} int main()
{
int n, m;
int s, t;
while(cin >> n >> m)
{
init();
sion a;
int x;
for(int i = ; i < m; i++)
{
scanf("%d%d%d",&x, &a.nxp, &a.dis);
li[x].push_back(a);
int temp = a.nxp;
a.nxp = x;
li[temp].push_back(a);
}
scanf("%d%d", &s, &t);
int y = spfa(s, t);
if(y >= INF)
{
printf("-1\n");
}
else printf("%d\n", y);
}
}

Dijkstra(邻接表版。临接矩阵需要注意的同上) 搞了几个小时,最后WA发现原来是原理没搞清orz,每次从一个点out后,需要找的是未被标记的离起点最小的点,而我找的是队列里离上一个点最小的点,这就有问题了。唉,人蠢没得治

 #include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#include <utility>
#include <vector>
#define MAXX 1010
#define MMI(x) memset(x, INF, sizeof(x))
#define MMF(x) memset(x, false, sizeof(x))
using namespace std; const int N = ;
const int INF = 0x3f3f3f3f; typedef struct sion
{
int dis;
int nxp;
}sion; vector<sion> edge[MAXX]; int dic[N];
bool vis[N]; void init()
{
memset(vis,false,sizeof(vis));
memset(dic,INF,sizeof(dic));
for(int i = ; i < MAXX; i++)
{
edge[i].clear();
}
}
void dijkstra(int &s, int &n)
{
queue<int >q;
vis[s] = ;
dic[s] = ;
q.push(s); while(!q.empty())
{
int mi = INF;
int t = q.front();
int x = ;
q.pop();
for(int i = ; i < edge[t].size(); i++)
{
int np = edge[t][i].nxp;
int s = dic[t] + edge[t][i].dis; if(dic[np] > s && !vis[np])
{
dic[np] = s;
}
}
for(int i = ; i < n; i ++)
if(!vis[i] && mi > dic[i])
mi = dic[i], x = i;
if(mi == INF)
break;
q.push(x);
vis[x] = ;
}
} int main()
{
int n, m;
sion a, b;
while(cin >> n >> m)
{
init();
int s, t;
for(int i = ; i < m; i++)
{
scanf("%d%d%d", &t, &a.nxp, &a.dis);
edge[t].push_back(a);
int temp = a.nxp;
a.nxp = t;
edge[temp].push_back(a);
}
scanf("%d%d", &s, &t);
dijkstra(s, n);
if(dic[t] >= INF)
printf("-1\n");
else
printf("%d\n", dic[t]);
}
}

HDU 1874 SPFA/Dijkstra/Floyd的更多相关文章

  1. hdu 1874(Dijkstra + Floyd)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Me ...

  2. ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  3. HDU 1874 畅通工程续 SPFA || dijkstra||floyd

    http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目大意: 给你一些点,让你求S到T的最短路径. 我只是来练习一下SPFA的 dijkstra+邻接矩阵 ...

  4. hdu3665-Seaside(SPFA,dijkstra,floyd)

    Seaside Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  5. hdu 1874 畅通工程续(模板题 spfa floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 spfa 模板 #include<iostream> #include<stdio ...

  6. hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...

  7. (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。

    floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...

  8. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

  9. HDU 1874 畅通工程续【Floyd算法实现】

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

随机推荐

  1. 团队协作第八周个人PSP

    11.3 --11.9本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 开始时间                结束时间 中断时间 实际用时 ...

  2. Thunder团队第六周 - Scrum会议5

    Scrum会议5 小组名称:Thunder 项目名称:i阅app Scrum Master:翟宇豪 工作照片: 胡佑蓉同学在拍照,所以不在照片内. 参会成员: 王航:http://www.cnblog ...

  3. 20172333 2017-2018-2 《Java程序设计》第10周学习总结

    20172333 2017-2018-2 <Java程序设计>第10周学习总结 教材学习内容 第十三章 集合是一个对象,一个保存其他对象的数据库. 集合可以保存不同种类的对象也可以保存同种 ...

  4. [离散化]人潮最多的時段( Interval Partitioning Problem )

    範例:人潮最多的時段( Interval Partitioning Problem ) 一群訪客參加宴會,我們詢問到每一位訪客的進場時刻與出場時刻,請問宴會現場擠進最多人的時段. 換個角度想,想像會場 ...

  5. 最长回文子串计算(fail)

    题意: 给定一个字符串s,在s中找到最长的回文子字符串.您可以假设s的最大长度为1000. 例子: 输入: “babad” 输出: “bab” 注: “aba”也是一个有效的答案. 我的答案: 想法: ...

  6. LintCode-8.旋转字符串

    旋转字符串 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例 对于字符串 "abcdefg". offset=0 => "abcdefg&qu ...

  7. iOS开发自定义试图切换

    CATransition *transition = [CATransition animation]; transition.duration = 1.0f; transition.timingFu ...

  8. Linux系统的性能测试

    性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench 一.CPU物理个数.内核.超线程.多核心 1.登录Terminal,执行:cat /proc/cpuinfo,就会显示出主机的CPU详 ...

  9. Delphi Dataset CurValue

    TField.CurValue Property Represents the current value of the field component including changes made ...

  10. delphi怎样单步调试

    在delphi的IDE编辑窗口里,主菜单->Run->Step Over或者主菜单->Run->Trace Into单步调试有两种方式:一种是Step Over,快捷键是F8, ...