dijkstra--O(n^2)做法模板
struct Dijkstra {
int n;
int mp[maxn][maxn]; // 记录地图
int dis[maxn], vis[maxn];
void init(int n) // 初始化
{
this -> n = n;
memset(mp, INF, sizeof(mp));
}
void addEdge(int s, int t, int w)
{
mp[s][t] = w;
mp[t][s] = w;
}
int dijkstra(int s, int t) // s --> t 的最短路
{
memset(vis, 0, sizeof(vis));
for(int i = 1;i <= n;i ++)
dis[i] = mp[s][i];
dis[s] = 0;
vis[s] = 1;
for(int i = 1;i <= n;i ++)
{
int mi = INF, tmp = -1;
for(int j = 1;j <= n;j ++)
{
if(!vis[j] && mi > dis[j])
{
tmp = j;
mi = dis[j];
}
}
if(tmp == -1)
continue;
vis[tmp] = 1;
for(int j = 1;j <= n;j ++)
{
if(!vis[j] && dis[j] > dis[tmp] + mp[tmp][j] && mp[tmp][j] < INF)
{
dis[j] = dis[tmp] + mp[tmp][j];
}
}
}
return dis[t];
}
}DIJKSTRA;