1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<limits>
5 #include<vector>
6 using namespace std;
7 const int maxn=6;
8 struct edge{
9 int to,cost;
10 edge(int t,int c){
11 this->to=t; this->cost=c;
12 }
13 };
14 void addEdge(vector<edge> &edgelist, vector<vector<int> > &G,int from,int to,int cost){
15 edge e = edge(to,cost);
16 edgelist.push_back(e);
17 G[from].push_back(edgelist.size()-1);
18 }
19 void addDoubleEdge(vector<edge> &edgelist, vector<vector<int> > &G,int from,int to,int cost){
20 addEdge(edgelist,G,from,to,cost);
21 addEdge(edgelist,G,to,from,cost);
22 }
23 int dijkstra(vector<edge> edgelist,vector<vector<int> > G,int v,int END){
24 vector<int> d(G.size());
25 vector<int> vis(G.size());
26 for(int i=0;i<vis.size();++i) vis[i]=false;
27 for(int i=0;i<d.size();++i) d[i]=numeric_limits<int>::max();
28 for(int i=0;i<G[v].size();++i){
29 edge e = edgelist[G[v][i]];
30 d[e.to] = e.cost;
31 }
32
33 vis[v]=true;
34
35 for(int i=1;i<G.size();++i){
36 int Min=numeric_limits<int>::max(), k;
37 for(int j=0;j<G.size();++j){
38 if(!vis[j] && d[j] < Min){
39 Min = d[j];
40 k = j;
41 }
42 }
43 vis[k]=true;
44
45 for(int j=0;j<G[k].size();++j){
46 edge e = edgelist[G[k][j]];
47 if(!vis[e.to] && d[k] + e.cost < d[e.to]) d[e.to] = d[k] + e.cost;
48 }
49 }
50 return d[END];
51 }
52 int prim(vector<edge> edgelist,vector<vector<int> > G,int v){
53 int overall_cost = 0;
54 vector<int> lowcost(G.size());
55 vector<int> closet(G.size());
56 vector<int> vis(G.size());
57 for(int i=0;i<vis.size();++i) vis[i]=false;
58 for(int i=0;i<lowcost.size();++i) lowcost[i]=numeric_limits<int>::max();
59
60 for(int i=0;i<G[v].size();++i){
61 edge e = edgelist[G[v][i]];
62 lowcost[e.to] = e.cost;
63 closet[e.to] = v;
64 }
65
66 vis[v]=true;
67 for(int i=1;i<G.size();++i){
68 int Min=numeric_limits<int>::max(), k;
69 for(int j=0;j<G.size();++j){
70 if(!vis[j] && lowcost[j] < Min){
71 Min = lowcost[j];
72 k = j;
73 }
74 }
75 cout<< Min <<endl;
76 overall_cost += Min;
77 vis[k] = true;
78 //closet[k] = v;
79 for(int j=0;j<G[k].size();++j){
80 edge e = edgelist[G[k][j]];
81 if(!vis[e.to] && e.cost < lowcost[e.to]){
82 lowcost[e.to] = e.cost;
83 closet[e.to] = k;
84 }
85 }
86 }
87 return overall_cost;
88 }
89 void buildMap(vector<edge> &edgelist, vector<vector<int> > &G){
90 addDoubleEdge(edgelist, G, 0, 1, 6);
91 addDoubleEdge(edgelist, G, 0, 2, 1);
92 addDoubleEdge(edgelist, G, 0, 3, 5);
93
94 addDoubleEdge(edgelist, G, 1, 2, 5);
95 addDoubleEdge(edgelist, G, 2, 3, 5);
96 addDoubleEdge(edgelist, G, 1, 4, 3);
97
98 addDoubleEdge(edgelist, G, 2, 4, 6);
99 addDoubleEdge(edgelist, G, 2, 5, 4);
100 addDoubleEdge(edgelist, G, 3, 5, 2);
101 addDoubleEdge(edgelist, G, 4, 5, 6);
102
103 /*
104 addEdge(edgelist,G,0,2,6);
105 addEdge(edgelist,G,0,1,4);
106 addEdge(edgelist,G,0,3,6);
107
108 addEdge(edgelist,G,1,2,1);
109 addEdge(edgelist,G,1,4,7);
110
111 addEdge(edgelist,G,2,5,4);
112 addEdge(edgelist,G,2,4,6);
113
114 addEdge(edgelist,G,3,5,5);
115 addEdge(edgelist,G,3,2,2);
116
117 addEdge(edgelist,G,4,6,6);
118
119 addEdge(edgelist,G,5,4,1);
120 addEdge(edgelist,G,5,6,8);
121 */
122 }
123 int main(){
124 vector<edge> edgelist;
125 vector<vector<int> > G(maxn);
126
127 buildMap(edgelist, G);
128
129 cout<<endl<<dijkstra(edgelist, G, 0, 5)<<endl;
130
131 cout<<prim(edgelist, G, 0)<<endl;
132
133 return 0;
134
135 }