dijk

.....................用矩阵存..................... 1 int mp[N][N];
 2 bool p[N];
 3 int dist[N];
 4 void dijk(int s , int n)
 5 {
 6     int i , j , k ;
 7     for( i = 1 ; i <= n ;i++)
 8     {
 9         p[i] = false;
10         dist[i] = mp[s][i];
11     }
12     p[s] = true;
13     dist[s] = 0;
14     for(i = 1 ; i < n ; i++)
15     {
16         int Min = INF;
17         int k = 0 ;
18         for( j = 1 ; j <= n ;j++)
19         {
20             if(!p[j]&&dist[j]<Min)
21             {
22                 Min = dist[j];
23                 k = j;
24             }
25         }
26         if(Min==INF) return ;
27         p[k] = true;
28         for(j = 1 ; j <= n ;j++)
29         {
30             if(!p[j]&&mp[k][j]!=INF&&dist[j]>dist[k]+mp[k][j])
31                 dist[j] = dist[k]+mp[k][j];
32         }
33     }
34 }
..............用链表存................. 1 struct Edge{
 2     int to;
 3     int v ;
 4     int next;
 5 }edge[M];
 6 int Enct;
 7 int head[N];
 8 void add(int from ,int to , int v )
 9 {
10     edge[Enct].to = to ;
11     edge[Enct].v = v ;
12     edge[Enct].next = head[from];
13     head[from] = Enct++;
14
15     edge[Enct].to = from ;
16     edge[Enct].v = v ;
17     edge[Enct].next = head[to];
18     head[to] = Enct++;
19 }
20 void init ()
21 {
22     Enct = 0;
23     memset(head,-1, sizeof(head));
24 }
25 int dist[N];
26 bool p[N];
27 void dijk(int s, int n)
28 {
29     int i , j , k ;
30     for( i = 1 ;  i <= n ; i++ )
31     {
32         p[i] = false;
33         dist[i]= INF;
34     }
35     p[s] = true;
36     dist[s] = 0;
37     for( i = head[s] ; i != -1 ; i = edge[i].next)
38     {
39         Edge e = edge[i];
40         if(e.v<dist[e.to])//考虑重边
41         dist[e.to] = e.v;
42     }
43     for( i = 1 ;i < n ;i++)
44     {
45         int Min = INF;
46         int k = 0 ;
47         for( j = 1 ; j <= n ; j++)
48         {
49             if(!p[j]&&dist[j]<Min)
50             {
51                 Min = dist[j];
52                 k = j;
53             }
54         }
55         p[k] = true;
56         if(Min == INF) return ;
57         for( j = head[k] ;j!=-1 ;j=edge[j].next)
58         {
59             Edge e = edge[j];
60             if(!p[e.to]&&dist[e.to]>dist[k]+e.v)
61             {
62                 dist[e.to] = dist[k]+e.v;
63             }
64         }
65     }
66 }
时间: 2024-08-17 06:25:20

dijk的相关文章

[bzoj2118]墨墨的等式【dijk+堆】

编译器真是神经了  k=k*2打成了k*2居然都不报错  还一点事情没有 害我改一晚上 一开始忘记了c++的数组默认从0开始 后来又把dijk写T了.....重申一遍,这里是先把所有点加进去然后依次pop() 至于这道题,大家都说它是一道数论好题 而狗王一定要把它当作spfa专题来讲给小朋友们听 ---erh... 网上题解有很多 首推po姐的 #include<cstdio> #define ll long long #define inf 1<<29 #include<a

Choose the best route(最短路)dijk

http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9602    Accepted Submission(s): 3111 Problem Description One day , Kiki wants

学习dijk最短路径中

#include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<time.h> using namespace std; int map[100][100]={0}; int book[100]={0}; int dis[100]={0};//顶点 int n=0,m=0; int minn=99999; int u=0; void Dijk()

Dijk入门(杭电2544题)

#include<iostream> #include<cstring> using namespace std; #define INF 0x3f3f3f3f int n,m; int map[105][105]; int vis[105]; int stemp[105]; int dijk(){ memset(vis,0,sizeof(vis)); vis[1]=1; //标记第一个已选 memset(stemp,0,sizeof(stemp)); int min; int f

[BZOJ1579] [Usaco2009 Feb]Revamping Trails 道路升级(分层图最短路 + 堆优化dijk)

传送门 dis[i][j]表示第i个点,更新了j次的最短路 此题不良心,卡spfa #include <queue> #include <cstdio> #include <cstring> #include <iostream> #define N 50001 using namespace std; struct node { int a, b, c; node(int a, int b, int c) : a(a), b(b), c(c) {} boo

关于Dijk采访的一些感想

有效的程序员不应该浪费很多时间用于程序调试,他们应该一开始就不要把故障引入! 反复,一遍又一遍的尝试,真的会让人心烦,对于有的问题解决不了,其实有很多原因,写出来的程序其实是非常考验人的细节处理能力的 同一个问题,头脑中得先把它想明白,要干啥?怎么样更快地干?要花多长时间去干? 不知道要干啥,很容易陷入一种盲目的状态,甚至走错思考的方向: 不清楚更快干的方法,会因为效率不高而心生烦躁: 对时间没有个大概预估,会影响一天其它事情的安排: 这些问题要先考虑好,不然动手也是浪费时间. 啊,这就是理论与

hdu 1874(Dijkstra )

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27692    Accepted Submission(s): 10019 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路

Codeforces Round #391 div1 757F (Dominator Tree)

首先先膜杜教orz 这里简单说一下支配树的概念 支配树是对一个有向图来讲的 规定一个起点s,如果s到v的路径上必须经过某些点u,那么离s最近的点u就是v的支配点 在树上的关系就是,v的父亲是u. 一般图的支配树需要使用tarjan算法,但是如果有向图是没有环的,可以采用另一种做法 按照拓扑序建立支配树,每次加点的时候,枚举能到它的所有点,求它们在当前支配树的最近公共祖先,那个点就是该点的支配点 这个题先建立一个最短路图,易知,这个图是没有环的有向图,所以建立支配树的时候就可以采用以上做法 orz

POJ3013 Big Christmas Tree[转换 最短路]

Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23387   Accepted: 5063 Description Christmas is coming to KCM city. Suby the loyal civilian in KCM city is preparing a big neat Christmas tree. The simple structure of t