标签:表示 return namespace out ogg i++ 顶点 ret mina
第一行两个数为n,m,n表示顶点个数,m表示边的条数。 (1 ≤ n, m ≤ 100 )
接下来m行,每一行有三个数t1、t2 和t3,表示顶点t1到顶点t2的路程是t3。请注意这些t1->t2是单向的。
输出N个数,分别为每个点到1号点的距离
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
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
标签:表示 return namespace out ogg i++ 顶点 ret mina
原文地址:https://www.cnblogs.com/fate-/p/12243960.html