题目描述
如图,求最短路径。
输入
顶点数n 边数m
m条边的顶点和权值
某两个顶点
输出
顶点0到每个顶点的最短路径
样例输入
6 9 0 2 5 0 3 30 1 0 2 1 4 8 2 1 15 2 5 7 4 3 4 5 3 10 5 4 18 0 4
样例输出
28
思路:模板
代码:
#include<bits/stdc++.h>
using namespace std;
const int inf = 9999999;
int n,m,a,b,dis[1005][1005],mapp[1005][1005],s,e,c;
bool d[1005];
void chu()
{
for(int i = 0; i <= n; i++)
for(int j = 0; j <= n; j++)
mapp[i][j]=inf;
}
void dijkstra()
{
for(int k = 0; k < n; k++)
{
fill(d,d+n+1,false);
d[k]=true;
while(1)
{
int u = 0;
for(int i = 0;i < n; i++)
{
if(!d[i]&&dis[k][i]!=inf&&(u==0||dis[k][i]<dis[k][u]))
{
u=i;
}
}
if(u==0)
break;
d[u]=true;
for(int i = 0; i < n; i++)
{
dis[k][i]=min(dis[k][i],dis[k][u]+mapp[u][i]);
}
}
}
return;
}
int main()
{
cin >> n >> m;
chu();
for(int i = 1;i <= m; i++)
{
cin >> s >> e >> c;
mapp[s][e]=c;
}
for(int i = 0; i <= n; i++)
for(int j = 0; j <= n;j++)
dis[i][j]=mapp[i][j];
cin >> a >> b;
dijkstra();
cout << dis[a][b];
return 0;
}