标准单源最短路模板,没法再标准了……
但是WA了两次,原因是I和J没搞清楚,模板题改模板的时候一定要注意格式。
当然,理解思想才是最重要的,DIJKSTRA是标准的贪心思路,不断地从之前的路径中筛选最短-比较-更新。
#include <iomanip>
#include <string.h>
#include <iostream>
using namespace std;
const int INF=0x3f3f3f3f;
int map[105][105];
int path[10005];
bool visited[10005];
int prev[10005];
void clearmap()
{
for (int i=0;i<105;i++)
{
for (int j=0;j<105;j++)
{
map[i][j]=INF;
}
}
memset(path,INF,sizeof(path));
memset(prev,0,sizeof(prev));
memset(visited,0,sizeof(visited));
}
void dijkstra(int n,int start)
{
for (int i=1;i<=n;i++)
{
path[i]=map[start][i];
if (path[i]==INF)
{
prev[i]=0;
}
else
prev[i]=start;
}
//path[start]=0;
visited[start]=true;
for (int i=1;i<=n-1;i++)
{
int minidx=-1;
int minnum=INF;
for (int j=1;j<=n;j++)
{
if (visited[j]==0 && path[j]<minnum)
{
minidx=j;
minnum=path[j];
}
}
visited[minidx]=1;
for (int j=1;j<=n;j++)
{
if (visited[j]==0 && (path[j]>map[minidx][j]+path[minidx]))
{
prev[j]=minidx;
path[j]=map[minidx][j]+path[minidx];
}
}
}
}
int main()
{
int end,route;
while (cin>>end>>route &&(end!=0 || route!=0))
{
clearmap();
for (int i=1;i<=route;i++)
{
int a,b,value;
cin>>a>>b>>value;
if(value<map[a][b])
{
map[a][b]=value;
map[b][a]=value;
}
}
dijkstra(end,1);
cout<<path[end]<<endl;
}
return 0;
}