1381:城市路(Dijkstra)

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 4066     通过数: 1163

【题目描述】

罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所处的城市为1,附近还有很多城市2~n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。

现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。

【输入】

输入n, m,表示n个城市和m条路;

接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。

【输出】

输出1到n的最短路。如果1到达不了n,就输出-1。

【输入样例】

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

【输出样例】

90

【提示】

【数据规模和约定】

1≤n≤2000

1≤m≤10000

0≤c≤10000

【来源】

No

Floyd:(被省略了。。。。)

Dijkstra:

#include<bits/stdc++.h>
using namespace std;
int g[][];
int n,m;
int dis[];
bool used[];
int main(){
memset(g,0x3f,sizeof(g));
cin>>n>>m;
for(int i=;i<=m;++i){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=min(g[a][b],c);
g[b][a]=min(g[b][a],c);
}
memset(dis,0x3f,sizeof(dis));
dis[]=;
for(int i=;i<=n;++i){
int minn=0x3f3f3f3f,minn_j=;
for(int j=;j<=n;++j){
if(used[j]==false&&dis[j]<minn){
minn=dis[j];
minn_j=j;
}
}
if(minn_j==)
break;
used[minn_j]=true;
for(int j=;j<=n;j++)
if(used[j]==false)
dis[j]=min(dis[j],dis[minn_j]+g[minn_j][j]);
}
if(dis[n]==0x3f3f3f3f)
cout<<-;
else
cout<<dis[n];
}

+领接表:

#include<bits/stdc++.h>
using namespace std;
struct node{
int to,val;
};
vector<node> edge[]; int dis[];
bool used[];
int main(){
int n,m;
cin>>n>>m;
int a,b,c;
for(int i=;i<=m;i++){
cin>>a>>b>>c;
node t;
t.to=b;t.val=c;
edge[a].push_back(t);
t.to=a;t.val=c;
edge[b].push_back(t);
}
memset(dis,0x3f,sizeof(dis));
dis[]=;
for(int i=;i<=n;i++){
int minn=0x3f3f3f3f,minn_j=;
for(int j=;j<=n;j++){
if(used[j]==false&&dis[j]<minn){
minn=dis[j];
minn_j=j;
}
}
if(minn_j==)
break;
used[minn_j]=true;
int from=minn_j;
for(int j=;j<edge[from].size();j++){
int to=edge[from][j].to;
int val=edge[from][j].val;
dis[to]=min(dis[to],dis[from]+val);
} } if(dis[n]==0x3f3f3f3f)
cout<<-;
else
cout<<dis[n]; return ;
}

+链式前向星:

#include<bits/stdc++.h>
using namespace std;
struct node
{
int to,val,next;
};
node edge[]; int dis[];
bool used[];
int head[];
int num=;
void add_edge(int from,int to,int val)
{
num++;
edge[num].to=to;
edge[num].val=val;
edge[num].next=head[from];
head[from]=num;
} int main()
{
int n,m;
cin>>n>>m;
int a,b,c;
for(int i=;i<=m;i++)
{
cin>>a>>b>>c;
add_edge(a,b,c);
add_edge(b,a,c);
} memset(dis,0x3f,sizeof(dis));
memset(used,false,sizeof(used));
dis[]=;
for(int i=;i<=n;i++)
{
int minn=0x3f3f3f3f,minn_j=;
for(int j=;j<=n;j++)
{
if(used[j]==false && dis[j]<minn)
{
minn=dis[j];
minn_j=j;
}
}
if(minn_j==)
break;
used[minn_j]=true;
int from=minn_j;
for(int j=head[from];j!=;j=edge[j].next)
{
int to=edge[j].to;
int val=edge[j].val;
dis[to]=min(dis[to],dis[from]+val);
}
} if(dis[n]==0x3f3f3f3f)
cout<<-;
else
cout<<dis[n]; return ;
}

最新文章

  1. 关于zigbee 网络拓扑节点数量的一点说明
  2. orale 函数大全[转]
  3. Tomcat指定特定JDK版本
  4. iOS 沙盒目录结构介绍
  5. C#list泛型集合
  6. Unity 屏幕震动效果实现
  7. linux性能优化cpu 磁盘IO MEM
  8. Oracle12c多租户CDB 与 PDB 参数文件位置探讨、查询 CDB 与 PDB 不同值的参数
  9. python知识点及面试面试大集合
  10. vc关于大文件读写
  11. 【转载】 A* 寻路算法 (个人认为最详细,最通俗易懂的一个版本)
  12. VMware workstation 与 VMware GSX Server 的区别
  13. LeetCode刷题(数据库)---- 超过5名学生的课
  14. go-ipfs入门及介绍
  15. MyEclipse异常关闭导致Tomcat不能启动的问题
  16. [转] Spark快速入门指南 – Spark安装与基础使用
  17. 适用于所有页面的基础样式base.css
  18. UVA 1363 Joseph&#39;s Problem 找规律+推导 给定n,k;求k%[1,n]的和。
  19. SQLSERVER2008以上版本的数据恢复
  20. elasticsearch从入门到出门-02-简单的CRUD

热门文章

  1. MinIO 分布式集群搭建
  2. P2380 狗哥采矿
  3. sshd服务及基于密钥远程登陆(无需密码)
  4. 如何学习python,个人的一些简单见解
  5. 在VMware环境下安装Windows2008
  6. 微信小程序api封装(promise)
  7. JenKins结合cppcheck及cpplint进行代码风格及静态代码检测
  8. 【Java】面向对象之多态
  9. rsync同步基本用法
  10. python中的__call__方法