/**************************************/ |直接求最短路就行了,不过注意是无向图 /**************************************/ #include<iostream> #include<queue> #include<vector> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 101; int g[maxn][maxn]; int dis[maxn]; int vis[maxn]; //此处在priority_queue中的技巧 struct node { int t, w; node(int tt, int ww) : t(tt), w(ww){} bool operator < (const node & q) const { return w > q.w; } }; vector<int> edges[maxn]; void init() { memset(g, 0, sizeof(g)); memset(dis, INF, sizeof(dis)); memset(vis, 0, sizeof(vis)); } void dijkstra_heap(int src) { priority_queue<node>Q; vis[src] = 1; dis[src] = 0; Q.push(node(src, 0)); while(!Q.empty()) { node curnode = Q.top(); Q.pop(); int u = curnode.t; vis[u] = 1; for(unsigned int i=0; i<edges[u].size(); i++) { int v = edges[u][i]; if(!vis[v] && dis[v] > dis[u] + g[u][v]) { dis[v] = dis[u] + g[u][v]; Q.push(node(v, dis[v])); } } while(!Q.empty() && vis[Q.top().t]) { Q.pop(); } if(Q.empty()) break; } } int main() { int V, E, i; while(scanf("%d%d", &V, &E)!=EOF) { if(V==0 && E==0) break; for(i=0; i<=V; i++) { edges[i].clear(); } init(); int f, t, w; for(i=0; i<E; i++) { scanf("%d%d%d", &f, &t, &w); edges[f].push_back(t); edges[t].push_back(f); g[f][t] = w; g[t][f] = g[f][t]; } dijkstra_heap(1); printf("%d/n", dis[V]); } return 0; }