码迷,mamicode.com
首页 > 其他好文 > 详细

Dirjkstra

时间:2020-01-30 22:47:48      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:表示   return   namespace   out   ogg   i++   顶点   ret   mina   

Description

给定n个点,m条有向边
求每个点到1号点的最短距离

Input

第一行两个数为n,m,n表示顶点个数,m表示边的条数。 (1 ≤ n, m ≤ 100 )

接下来m行,每一行有三个数t1、t2 和t3,表示顶点t1到顶点t2的路程是t3。请注意这些t1->t2是单向的。

Output

输出N个数,分别为每个点到1号点的距离

Sample Input

6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4

Sample Output

0 1 8 4 13 17



 1 #include<iostream>
 2 #define inf 0x3f3f3f3f
 3 int book[103],e[103][103],dis[103];
 4 using namespace std;
 5 int main(){
 6     int n,m;
 7     cin>>n>>m;//录入 
 8     for(int i=1;i<=n;i++){//初始化 
 9         for(int j=1;j<=n;j++){
10             if(i==j)
11                 e[i][j]=0;
12             else
13                 e[i][j]=inf;    
14         }
15     }
16     for(int i=1;i<=m;i++){//录入 
17         int a,b,c;
18         cin>>a>>b>>c;
19         e[a][b]=c;
20     }
21     for(int i=1;i<=n;i++){//初始化 
22         dis[i]=e[1][i];
23     }
24     int u;
25     book[1]=1;
26     for(int i=1;i<=n-1;i++){//进行n-1次 
27         int mina=inf;
28         for(int j=1;j<=n;j++){//选出离源点最近的点(这个点目前还不在book集合里) 
29             if(book[j]==0&&dis[j]<mina){
30                 mina=dis[j];
31                 u=j;        
32             }
33         }
34         book[u]=1;//将这个点放进book集合里 
35         for(int v=1;v<=n;v++){//用这个点来松弛各个点 
36             if(e[u][v]<inf){//只有这个点到其他点有路才可以松弛 
37                 if(dis[v]>dis[u]+e[u][v])
38                     dis[v]=dis[u]+e[u][v];
39             }
40         }
41     }
42     for(int i=1;i<=n;i++){//输出 
43         cout<<dis[i]<< ;
44     }
45     return 0;
46 } 

 

这是没有进行优化的,目前复杂度还挺高的,数据大的话,就会超时了,一般都用优化之后的,优化的以后再补充吧!!!
O(∩_∩)O



Dirjkstra

标签:表示   return   namespace   out   ogg   i++   顶点   ret   mina   

原文地址:https://www.cnblogs.com/fate-/p/12243960.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!