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 0x3f3f3f3f
using 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;
}