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的更多相关文章

  1. HDU——1874畅通工程续(Dijkstra与SPFA)

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

  2. HDU | 1874 畅通工程续 SPFA&DIJIESITLA

    题目: 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰 ...

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

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

  4. HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题

    参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上:  迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...

  5. hdu 1874 畅通工程续

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...

  6. HDU 1874畅通工程续(迪杰斯特拉算法)

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

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

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

  8. hdu 1874 畅通工程续(迪杰斯特拉优先队列,floyd,spfa)

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

  9. HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)

    题目链接: 传送门 畅通工程续 Time Limit: 1000MS     Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...

随机推荐

  1. 九度 题目1154:Jungle Roads

    题目描写叙述: The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid mon ...

  2. POJ 2104 K-th Number 静态主席树(裸

    题目链接:点击打开链接 题意: 给定n长的序列.q个询问 以下n个数字给出序列 每一个询问[l, r] k ,输出该区间中第k大的数 先建一个n个节点的空树.然后每次从后往前新建一棵树,依附原来的空树 ...

  3. js---08函数 定时器

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  4. single-page关于vue-router

    最近复习了vue,项目实战前有练手,做一个简单的单页面应用. 1.router-view就是我们渲染的组件,router-view被包裹在一个div中,一旦路由跳转,router-view就会被渲染为 ...

  5. POJ 2181 贪心

    思路: 贪心 对于每个波浪 ans+=最大值-最小值 注意最后一定是选最大值 //By SiriusRen #include <cstdio> using namespace std; i ...

  6. OpenCV特征点检测——Surf(特征点篇)&flann

    学习OpenCV--Surf(特征点篇)&flann 分类: OpenCV特征篇计算机视觉 2012-04-20 21:55 19887人阅读评论(20)收藏举报 检测特征 Surf(Spee ...

  7. Linux平台下Ntop流量监测安装,并实现Netflow全过程

    Linux平台下Ntop流量监测安装,并实现Netflow全过程 更多原创教学视频详见: http://you.video.sina.com.cn/m/1443650204 本文出自 "李晨 ...

  8. vue 点击事件阻止冒泡 用stop

    1.使用vue阻止子级元素的click事件冒泡,很简单,用stop.eg: @click.stop='xxx'

  9. POJ 1061 青蛙的约会 数论水题

    http://poj.org/problem?id=1061 傻逼题不多说 (x+km) - (y+kn) = dL 求k 令b = n-m ; a = x - y ; 化成模线性方程一般式 : Lx ...

  10. init进程

    2.Linux下的三个特殊进程 Linux下有三个特殊的进程idle进程(PID=0),init进程(PID=1),和kthreadd(PID=2)idle进程由系统自动创建,运行在内核态idle进程 ...