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

201609-4交通规划 不知道错哪了

时间:2017-03-06 20:31:15      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:规划   space   [1]   ios   ret   string   交通规划   for   nod   

 1 #include <string.h>
 2 #include<cstdio>
 3 #include<stdio.h>
 4 #include <iostream>
 5 #include<string>
 6 using namespace std;
 7 int ll[1001][1001];
 8 struct node
 9 {
10     int per;
11     int sumlen;
12     bool vis;
13     node() :per(0), sumlen(0),vis(0) {};
14 };
15 node dd[1001];
16 int dijikstra(int s,int n)
17 {
18     int i,sum = 0,j, min,count=0;
19     while (count < n-1)
20     {
21         min = 1 << 30;
22         dd[s].vis = 1;//s为每次可能替换成的前驱
23         for (i = 1; i <= n; i++)
24         {
25             if (ll[s][i]>0&& !dd[i].vis)//次节点的前驱可修改
26             {
27                 if (!dd[i].per)//没有前驱
28                 {
29                     dd[i].per = s;
30                     dd[i].sumlen += ll[s][i]+dd[s].sumlen;
31                 }
32                 else//已有前驱 判断是否变动
33                 {
34                     if (dd[i].sumlen > dd[s].sumlen + ll[i][s])
35                     {
36                         dd[i].per = s;
37                         dd[i].sumlen = dd[s].sumlen + ll[i][s];
38                     }
39                     else if (dd[i].sumlen == dd[s].sumlen + ll[i][s])//注意我们要求的是最短公路
40                     {
41                         if (ll[i][dd[i].per] > ll[i][s])
42                         {
43                             dd[i].per = s;
44                             dd[i].sumlen = dd[s].sumlen + ll[i][s];
45                         }
46                     }
47                 }
48             }
49             if (!dd[i].vis&&dd[i].sumlen&&min >=dd[i].sumlen)//min记录每次最短公路
50             {
51                 if (min == dd[i].sumlen)
52                 {
53                     if (ll[dd[j].per][j] > ll[dd[i].per][i])
54                     {
55                         min = dd[i].sumlen;
56                         j = i;
57                     }
58                 }
59                 else
60                 {
61                     min = dd[i].sumlen;
62                     j = i;
63                 }
64             }
65         }
66         s = j;
67         sum += ll[dd[j].per][j];
68         count++;
69     }
70     return sum;
71 }
72 int main()
73 {
74     memset(ll,-1,sizeof(ll));
75     int n, m; cin >> n >> m;
76     //n = 4; m = 5;
77     int i, a, b, c;
78     for (i = 1; i <= n; i++)
79         ll[i][i] = 0;
80     for (i = 0; i < m; i++)
81     {
82         cin >> a >> b >> c;
83         ll[a][b] = ll[b][a] = c;
84     }
85     /*ll[1][2] = ll[2][1] = 4;
86     ll[1][3] = ll[3][1] = 5;
87     ll[2][3] = ll[3][2] = 2;
88     ll[2][4] = ll[4][2] = 3;
89     ll[3][4] = ll[4][3] = 2;*/
90     cout << dijikstra(1, n) << endl;
91     return 0;
92 }

 

201609-4交通规划 不知道错哪了

标签:规划   space   [1]   ios   ret   string   交通规划   for   nod   

原文地址:http://www.cnblogs.com/yuelien/p/6511573.html

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