HDU 1874 畅通工程续 SPFA || dijkstra||floyd
http://acm.hdu.edu.cn/showproblem.php?pid=1874
题目大意:
给你一些点,让你求S到T的最短路径。
我只是来练习一下SPFA的
dijkstra+邻接矩阵
#include<cstdio>
#include<cstring>
const int MAXN=200+10;
const int INF=1000000;
int n,m,map[MAXN][MAXN],dis[MAXN];
bool vis[MAXN]; void dijkstra(int s)
{
memset(vis,0,sizeof(vis));
int cur=s;
dis[cur]=0;
vis[cur]=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
if(!vis[j] && dis[cur] + map[cur][j] < dis[j])
dis[j]=dis[cur] + map[cur][j] ; int mini=INF;
for(int j=0;j<n;j++)
if(!vis[j] && dis[j] < mini)
mini=dis[cur=j];
vis[cur]=true;
} }
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
{
dis[i]=INF;
for(int j=0;j<n;j++)
map[i][j]=INF;
}
for(int i=0;i<m;i++)
{
int from,to,val;
scanf("%d%d%d",&from,&to,&val);
if(map[from][to] > val)
map[to][from]=map[from][to]=val;
}
int s,t;
scanf("%d%d",&s,&t);
dijkstra(s);
if(dis[t]==INF)
printf("-1\n");
else
printf("%d\n",dis[t]);
}
return 0; }
dijkstra+优先队列
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=200+10;
const int MAXM=40000+10;
const int INF=1000000;
int n,m,dis[MAXN],head[MAXN],len;
bool vis[MAXN]; struct edge
{
int to,val,next;
}e[MAXM]; void add(int from,int to,int val)
{
e[len].to=to;
e[len].val=val;
e[len].next=head[from];
head[from]=len++;
}
struct point
{
int val,id;
point(int id,int val):id(id),val(val){}
bool operator <(const point &x)const{
return val>x.val;
}
};
void dijkstra(int s)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
dis[i]=INF; priority_queue<point> q;
q.push(point(s,0));
dis[s]=0;
while(!q.empty())
{
int cur=q.top().id;
q.pop();
if(vis[cur]) continue;
vis[cur]=true;
for(int i=head[cur];i!=-1;i=e[i].next)
{
int id=e[i].to;
if(!vis[id] && dis[cur]+e[i].val < dis[id])
{
dis[id]=dis[cur]+e[i].val;
q.push(point(id,dis[id]));
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
len=0;
memset(head,-1,sizeof(head)); for(int i=0;i<m;i++)
{
int from,to,val;
scanf("%d%d%d",&from,&to,&val);
add(from,to,val);
add(to,from,val);
} int s,t;
scanf("%d%d",&s,&t);
dijkstra(s);
if(dis[t]==INF)
printf("-1\n");
else
printf("%d\n",dis[t]);
}
return 0; }
SPFA+邻接矩阵:
#include<cstdio>
#include<queue>
using namespace std;
const int INF=1000000;
const int MAXN=200+10;
int n,m;
int map[MAXN][MAXN];
int dis[MAXN];
void SPFA(int s)
{
for(int i=0;i<n;i++)
dis[i]=INF; bool vis[MAXN]={0}; vis[s]=true;
dis[s]=0; queue<int> q;
q.push(s);
while(!q.empty())
{
int cur=q.front();
q.pop();
vis[cur]=false;
for(int i=0;i<n;i++)
{
if(dis[cur] + map[cur][i] < dis[i])
{
dis[i]=dis[cur] + map[cur][i];
if(!vis[i])
{
q.push(i);
vis[i]=true;
}
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
map[i][j]=INF; for(int i=0;i<m;i++)
{
int from,to,dis;
scanf("%d%d%d",&from,&to,&dis);
if(map[from][to]>dis)
map[from][to]=map[to][from]=dis;
}
int s,t;
scanf("%d%d",&s,&t);
SPFA(s);
if(dis[t]==INF)
puts("-1");
else
printf("%d\n",dis[t]);
}
return 0;
}
SPFA+邻接表
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=200+10;
const int MAXM=40000+10;
const int INF=1000000;
int n,m,dis[MAXN],head[MAXN],len;
bool vis[MAXN]; struct edge
{
int to,val,next;
}e[MAXM]; void add(int from,int to,int val)
{
e[len].to=to;
e[len].val=val;
e[len].next=head[from];
head[from]=len++;
}
void spfa(int s)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
dis[i]=INF; queue<int> q;
q.push(s);
vis[s]=true;
dis[s]=0;
while(!q.empty())
{
int cur=q.front();
q.pop();
vis[cur]=false;
for(int i=head[cur];i!=-1;i=e[i].next)
{
int id=e[i].to;
if(dis[id] > dis[cur]+e[i].val)
{
dis[id] = dis[cur] + e[i].val;
if(!vis[id])
{
vis[id]=true;
q.push(id);
}
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
len=0;
memset(head,-1,sizeof(head)); for(int i=0;i<m;i++)
{
int from,to,val;
scanf("%d%d%d",&from,&to,&val);
add(from,to,val);
add(to,from,val);
} int s,t;
scanf("%d%d",&s,&t);
spfa(s);
if(dis[t]==INF)
printf("-1\n");
else
printf("%d\n",dis[t]);
}
return 0; }
floyd:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=200+10;
const int INF=1000000;
int n,m,dis[MAXN][MAXN]; void floyd()
{
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
dis[i][j]=INF; for(int i=0;i<m;i++)
{
int from,to,val;
scanf("%d%d%d",&from,&to,&val);
if(dis[from][to] > val)
dis[to][from]=dis[from][to]=val;
}
int s,t;
scanf("%d%d",&s,&t);
if(s==t)
{
printf("0\n");
continue;
}
floyd();
if(dis[s][t]==INF)
printf("-1\n");
else
printf("%d\n",dis[s][t]);
}
return 0; }
HDU 1874 畅通工程续 SPFA || dijkstra||floyd的更多相关文章
- HDU——1874畅通工程续(Dijkstra与SPFA)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- HDU | 1874 畅通工程续 SPFA&DIJIESITLA
题目: 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰 ...
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上: 迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...
- hdu 1874 畅通工程续
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...
- HDU 1874畅通工程续(迪杰斯特拉算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) ...
- hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...
- hdu 1874 畅通工程续(迪杰斯特拉优先队列,floyd,spfa)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)
题目链接: 传送门 畅通工程续 Time Limit: 1000MS Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...
随机推荐
- Markdown编辑器为什么好用以及好用的markdown编辑器
Markdown编辑器为什么好用以及好用的markdown编辑器 一.总结 一句话总结:Markdown 是一种简单的.轻量级的标记语法.用户可以使用诸如 * # 等简单的标记符号以最小的输入代价生成 ...
- go 可以开发桌面应用
go 可以开发桌面应用 go 可以开发桌面应用,但并不是很舒适.可以使用的GUI库有:1.goqt,LiteIDE作者出品,Go和QT的绑定,还未发布2.go.uik,纯Go实现的并发UI工具3.wa ...
- vue组件中 IS 用法
//html <link rel="stylesheet" href="http://www.jq22.com/demo/animate-141106223642/ ...
- Sparse Autoencoder(一)
Neural Networks We will use the following diagram to denote a single neuron: This "neuron" ...
- centos的dns配置总结
找的一篇好的存根 DNS正反向解析 DNS(Domain Name Service)域名服务.就是域名解析服务器.所谓名称解析的过程就是某个应用程序基于某个搜索键在指定的数据库中查询.而后查询到某些对 ...
- Python爬虫之『urlopen』
本文以爬取百度首页为示例来学习,python版本为python3.6.7,完整代码会在文章末附上 本次学习所用到的python框架:urllib.request 本次学习所用到的函数: urllib. ...
- spinner -样式实现
这里主要是在theme中实现spinner的样式,如下 <style name="Theme.Funui" parent="Theme.Holo.Light&qu ...
- 团队作业-Beta冲刺(1)
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 这个作业要求在哪里 https://edu.cnblo ...
- Elasticsearch之插件扩展
Elasticsearch之插件介绍及安装 Elasticsearch之head插件安装之后的浏览详解 Elasticsearch之kopf插件安装之后的浏览详解 Elasticsearch-2.4. ...
- c#的中英文混合字符串截取 public static string SubString(string inputString, int byteLength)
/// <summary> /// c#的中英文混合字符串截取(区分中英文) /// </summary> /// <param ...