图论 -- 最短路径 dijkstra 算法模版 hdu 1874

来源:互联网 发布:庞氏骗局 知乎 编辑:程序博客网 时间:2024/05/18 02:45

最短路的dijkstra 算法模版 (以 hdu 1874为题目写出模版      详细解释 )

代码如下:

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;


const int maxn = 505;
const int inf = 0x3f3f3f3f;
int n,m;
int dis[maxn];
int S, T;
vector<pair<int, int> > e[maxn];


void dijkstra(int s)
{
dis[s] = 0;  //dis[t]为s 到t的最小距离 
priority_queue<pair<int, int> > que;
que.push(make_pair(-dis[s], s)); //因为pair里面带的比较规则是从大到小的排序,而我们需要的是从小到大的排序,所以加一个负号使得比较规则反过来; 
while(!que.empty()){ // 当非空时 
int now = que.top().second;
que.pop();
for(int i = 0; i < e[now].size(); i++){
int k = e[now][i].first;      //此处二维数组的含义是  例如vector<int> a;  则其中的元素是a[0]  a[1] ......
//而此时 vector<int> e[N]  所以此时的元素是  e[1][0]   e[1][1]   e[1][2] ..........
//而e[now][i] 表示的含义是  例如  定义  vector<int> e[100];
//e[2].push_back(10); e[2].push_back(11);  e[2].push_back(12);
//所以e[now].size()  即 e[2].size() == 3;  e[2][0] == 10; e[2][1] == 11;
//如果vector 中的是一个pair类型  则可以用 e[2][0].first; 即e[now][i].second 的由来; 
if(dis[k] > dis[now] + e[now][i].second){
dis[k] = dis[now] + e[now][i].second;
que.push(make_pair(-dis[k], k));
}
}
}
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF){
memset(dis, inf, sizeof(dis));
for(int i = 0; i < maxn; i++) e[i].clear();
for(int i = 0; i < m; i++){
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
e[u].push_back(make_pair(v, c));
e[v].push_back(make_pair(u, c));  //注意双向的情况
}
scanf("%d%d", &S, &T);
dijkstra(S);
if(dis[T] < inf)
printf("%d\n", dis[T]);
else 
printf("%d\n", -1);
}
return 0;
}

原创粉丝点击