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;
}