【题目链接】
http://poj.org/problem?id=2387
题目意思
她想从奶牛场尽快回去睡美容觉,问你最短路径是多少?(1为家,n为奶牛场)
解题思路
最短路模板题,数据不大用邻接矩阵或邻接表都可以。下面是spfa的代码
代码部分
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <string>
#include <map>
using namespace std;
#define LL long long
#define inf 0x3f3f3f3
const int N = 2e5+5;
int dis[N]; ///存储最短路
int vis[N]; ///记录是否在队列
int t,n;
struct node
{
int v,w;
}s;
vector<node>m[N];
void init()
{
for (int i = 0;i <= n; i++)
{
dis[i] = inf;
vis[i] = 0;
}
}
void spfa()
{
queue<int>q;
q.push(n);
vis[n] = 1;
dis[n] = 0;
while (!q.empty())
{
int t = q.front();
q.pop();
for (int i = 0; i < m[t].size();i++)
{
if (dis[m[t][i].v] > dis[t]+m[t][i].w) ///松弛
{
dis[m[t][i].v] = dis[t]+m[t][i].w;
if (!vis[m[t][i].v]) ///判断是否在队列
{
q.push(m[t][i].v);
vis[m[t][i].v] = 1;
}
}
}
vis[t] = 0;
}
}
int main()
{
scanf("%d %d",&t,&n);
init();
for(int i =0; i < t;i++)
{
int v,u,w;
scanf("%d %d %d",&v,&u,&w);
s.v = v;
s.w = w;
m[u].push_back(s); ///双向加入邻接表
s.v = u;
m[v].push_back(s);
}
spfa();
printf("%d\n",dis[1]);
return 0;
}