题目大意
输入T, N;分别代表无向图边的数目和节点的数目;
接下来T行,每行三个数u,v, w 代表u, v,之间存在一条边权重为w;
要求:求出节点N 到节点1的最短距离;
题解
主要使用了dijistra算法,使用邻接表的方法存图。
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAXT = 2005 * 2;
const int MAXN = 1005;
const int INF = 0x7fffffff;
int T, N;
struct Edge
{
int nt;
int v;
int w;
};
Edge edge[MAXT];
int head[MAXN];
int cnt = 0;
void addEdge(int u, int v, int w)
{
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].nt = head[u];
head[u] = cnt;
++cnt;
}
int d[MAXN];
int vis[MAXN];
void init()
{
for(int i = 1; i <= N; ++i)
{
d[i] = INF;
vis[i] = 0;
}
}
struct P
{
int id;
int d;
};
struct cmp
{
bool operator()(const P& a, const P& b)
{
return a.d > b.d;
}
};
void dij()
{
init();
d[N] = 0;
vis[N] = 1;
priority_queue<P, vector<P>, cmp> q;
P tmp, now;
now.d = 0;
now.id = N;
q.push(now);
while(!q.empty())
{
now = q.top();
q.pop();
int id = now.id;
int dis = now.d;
if(d[id] < dis) continue;
vis[id] = 1;
for(int i = head[id]; i != -1; i = edge[i].nt)
{
int v = edge[i].v;
if(vis[v] == 1)continue;
int w = edge[i].w;
if(dis + w < d[v])
{
d[v] = dis + w;
tmp.d = d[v];
tmp.id = v;
q.push(tmp);
}
}
}
}
int main()
{
scanf("%d%d",&T, &N);
int u, v, w;
memset(head, -1, sizeof(head));
cnt = 0;
for(int i = 0; i < T; ++i)
{
scanf("%d%d%d", &u, &v, &w);
addEdge(u, v, w);
addEdge(v, u, w);
}
dij();
printf("%d\n", d[1]);
return 0;
}
如有错误,恳请指正