7-14 Dijkstra算法(模板) (30 分)
给一个n(1 ≤ n ≤ 2500) 个点 m(1 ≤ m ≤ 6200) 条边的无向图,求 s 到 t 的最短路。
输入格式:
第一行四个由空格隔开的整数 n、m、s、t。
之后的 m 行,每行三个正整数 si、ti、wi(1≤wi≤109),表示一条从si 到 ti 长度为 wi 的边。
输出格式:
一个整数,表示从s 到t 的最短路径长度。数据保证至少存在一条道路。
输入样例:
7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1
输出样例:
7
注意:
两个顶点之间可能存在多条直接相连的道路。
给男神上代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define max 3001
int e[max][max];
int dis[max];
int visited[max];
int n,m;
void setArray()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)e[i][j]=0;
else
e[i][j]=INF;
visited[i]=0;
}
}
}
void Dijkstra(int s)
{
visited[s]=1;
for(int i=0;i<n-1;i++)
{
int u;
visited[s]=1;
int min=INF;
for(int j=1;j<=n;j++)
{
if(dis[j]<min&&visited[j]==0)
{
min=dis[j];
u=j;
}
}
visited[u]=1;
for(int v=1;v<=n;v++)
{
if(e[u][v]<INF)
{
if(dis[v]>dis[u]+e[u][v])
{
dis[v]=dis[u]+e[u][v];
}
}
}
}
}
int main()
{
cin>>n>>m;
setArray();
int s,t;
cin>>s>>t;
for(int i=0;i<m;i++)
{
int a,b,weight;
cin>>a>>b>>weight;
e[a][b]=weight;
e[b][a]=weight;
}
for(int i=1;i<=n;i++)
{
dis[i]=e[s][i];
}
Dijkstra(s);
cout<<dis[t]<<endl;
return 0;
}