题意:给一个无向图,求从点1到n的最短路。
解法:dijkstra。灰常裸……
代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define LL long long using namespace std; struct node { int v, val; node(int v, int val) : v(v), val(val) {} node() {} }; vector <node> edge[1005]; int dis[1005]; bool vis[1005]; const int inf = 0x3f3f3f3f; int main() { int n, m; while(~scanf("%d%d", &m, &n)) { memset(dis, inf, sizeof dis); memset(vis, 0, sizeof vis); for(int i = 0; i < m; i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); edge[a].push_back(node(b, c)); edge[b].push_back(node(a, c)); if(a == 1) dis[b] = min(dis[b], c); if(b == 1) dis[a] = min(dis[a], c); } dis[1] = 0; vis[1] = 1; while(1) { int pos = -1, minn = inf; for(int i = 1; i <= n; i++) { if(!vis[i] && minn > dis[i]) { pos = i; minn = dis[i]; } } if(pos == -1) break; vis[pos] = 1; int len = edge[pos].size(); for(int i = 0; i < len; i++) { int u = edge[pos][i].v; dis[u] = min(dis[u], dis[pos] + edge[pos][i].val); } } printf("%d ", dis[n]); } return 0; }