带权边的dijkstra
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 ID: xjtuacm1 3 PROG: comehome 4 LANG: C++ 5 */ 6 #include<iostream> 7 #include<stack> 8 #include<cstring> 9 #include<cstdio> 10 #include<queue> 11 #include<algorithm> 12 #include<set> 13 #include<map> 14 using namespace std; 15 const int INF = 0x3f3f3f3f; 16 const int M = 10000; 17 const int N = 52; 18 19 // Graph structure 20 int n; 21 int to[M], nxt[M], head[N]; 22 int w[M]; 23 bool vis[N]; 24 int e; 25 int dist[N]; // Distance array 26 struct cmp 27 { 28 bool operator() (int a, int b) 29 { 30 return dist[a] > dist[b]; 31 } 32 }; 33 34 void init() 35 { 36 memset(vis, false, sizeof(vis)); 37 memset(head, -1, sizeof(head)); 38 e = 0; 39 } 40 void addEdge(int u, int v, int c) 41 { 42 to[e] = v; 43 nxt[e] = head[u]; 44 w[e] = c; 45 head[u] = e++; 46 } 47 48 void addBiEdge(int u, int v, int c) 49 { 50 addEdge(u, v, c); 51 addEdge(v, u, c); 52 } 53 54 void dijkstra(int src) 55 { 56 // Reset distance array 57 memset(vis, false, sizeof(vis)); 58 for(int i = 0; i!= n; i++) 59 dist[i] = INF; 60 61 priority_queue<int, vector<int>, cmp> que; 62 vis[src] = true; 63 dist[src] = 0; 64 que.push(src); 65 int pnt = src; 66 for(int i = 1; i!=n; i++) 67 { 68 for(int j = head[pnt]; j!= -1; j = nxt[j]) 69 { 70 int v = to[j]; 71 if(!vis[v] && dist[pnt] + w[j] < dist[v]) 72 { 73 dist[v] = dist[pnt] + w[j]; 74 que.push(v); 75 } 76 } 77 while(!que.empty() && vis[que.top()]) 78 que.pop(); 79 if(que.empty()) 80 break; 81 82 pnt = que.top(); que.pop(); 83 vis[pnt] = true; 84 } 85 } 86 87 set<char> cows; 88 int r[N]; 89 bool indirectCmp(int a, int b) 90 { 91 return dist[a] < dist[b]; 92 } 93 94 int toIdx(char ch) 95 { 96 if(ch != tolower(ch)) 97 return ch - 'A'; 98 else 99 return ch - 'a' + 26; 100 } 101 char toChar(int idx) 102 { 103 if(idx < 26) 104 return idx + 'A'; 105 else 106 return idx - 26 + 'a'; 107 } 108 109 int main(int argc, char *argv[]) 110 { 111 freopen("comehome.in", "r", stdin); 112 #ifndef USACO 113 freopen("comehome.out", "w", stdout); 114 #endif // USACO 115 116 int p; 117 scanf("%d\n", &p); 118 119 n = N; 120 init(); 121 122 while(p--) 123 { 124 char f, t; 125 int c; 126 scanf("%c %c %d\n", &f, &t, &c); 127 if(f == t) 128 continue; 129 130 bool flag = false; 131 for(int edge = head[toIdx(f)]; edge != -1; edge = nxt[edge]) 132 if(to[edge] == (toIdx(t))) 133 { 134 w[edge] = min(w[edge], c); 135 flag = true; 136 break; 137 } 138 for(int edge = head[toIdx(t)]; edge != -1; edge = nxt[edge]) 139 if(to[edge] == (toIdx(f))) 140 { 141 w[edge] = min(w[edge], c); 142 flag = true; 143 break; 144 } 145 if(flag) 146 continue; 147 148 addBiEdge(toIdx(f), toIdx(t), c); 149 } 150 151 dijkstra(toIdx('Z')); 152 153 for(int i = 0; i!= n; i++) 154 r[i] = i; 155 156 sort(r, r+n, indirectCmp); 157 for(int i = 1; i!= n; i++) 158 { 159 if(r[i] < 26) 160 { 161 printf("%c %d\n", toChar(r[i]), dist[r[i]]); 162 break; 163 } 164 } 165 166 return 0; 167 }