首页 > 学院 > 开发设计 > 正文

SDUT 2894 C--最短路

2019-11-08 01:48:53
字体:
来源:转载
供稿:网友

SDUT 2894 C–最短路

Time Limit: 7000MS Memory Limit: 65536KB

PRoblem Description


给出一个带权无向图,包含n个点,m条边。求出s,e的最短路。保证最短路存在。

Input


多组输入。 对于每组数据。 第一行输入n,m(1<= n && n<=5*10^5,1 <= m && m <= 2*10^6)。 接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。 最后输入s,e。

Output


对于每组数据输出一个整数代表答案。

Example Input


3 1 1 2 3 1 2

Example Output


3

Hint

spfa算法:http://blog.csdn.net/muxidreamtohit/article/details/7894298 前向星:http://blog.csdn.net/acdreamers/article/details/16902023

Submit


#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;const int MAXN = 555555;struct Edge{ int next, u, v, w;}edge[10*MAXN];int i, j, k;int N, M;int s, e, cnt;int head[MAXN];int visit[MAXN], dist[MAXN];void spfa(){ queue<int>q; while(!q.empty()) q.pop(); memset(visit, 0, sizeof(visit)); memset(dist, INF, sizeof(dist)); visit[s] = 1;//用于记录是否在队列中 dist[s] = 0; q.push(s); while(!q.empty())//通过队列先进先出的特性不断进行松弛操作 { int u = q.front(); q.pop(); visit[u] = 0; for(i = head[u]; ~i; i = edge[i].next) { int v = edge[i].v; int w = edge[i].w; if(dist[v] > dist[u]+w) { dist[v] = dist[u] + w; if(!visit[v]) { visit[v] = 1; q.push(v); } } } } printf("%d/n", dist[e]);}int main(){ while(~scanf("%d %d", &N, &M)) { int u, v, w; memset(head, -1, sizeof(head)); cnt = 0; for(i = 0; i < M; i++)//以前向星存储输入数据 { scanf("%d %d %d", &u, &v, &w); edge[cnt].w = w; edge[cnt].v = v; edge[cnt].u = u; edge[cnt].next = head[u]; head[u] = cnt++; edge[cnt].w = w; edge[cnt].v = u; edge[cnt].u = v; edge[cnt].next = head[v]; head[v] = cnt++; } scanf("%d %d", &s, &e); spfa(); } return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表