在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入保证至少存在1条商店到赛场的路线。
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
Sample Output
3
2AC代码:dijkstra算法,模板题
#include<iostream>
#include<cstring>
using namespace std;
int mmap[1005][1005];
bool vis[1005];
int dist[1005];
int n,m;
#define INF 0x3f3f3f3f
void dijkstra(int x)
{
for(int i=1;i<=n;i++)
dist[i]=mmap[x][i];
int mmin;
int k;
for(int i=1;i<=n;i++)
{
mmin=INF;
for(int j=1;j<=n;j++)
{
if(!vis[j] && dist[j]<mmin)
{
mmin=dist[j];
k=j;
}
}
vis[k]=true;
for(int j=1;j<=n;j++)
{
if(!vis[j] && dist[k]+mmap[k][j]<dist[j])
dist[j]=dist[k]+mmap[k][j];
}
}
}
int main()
{
int u,v,w;
while(cin>>n>>m &&n &&m)
{
memset(mmap,0,sizeof(mmap));
memset(vis,false,sizeof(vis));
memset(dist,0,sizeof(dist));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
mmap[i][j]=0;
else
mmap[i][j]=INF;
}
}
while(m--)
{
cin>>u>>v>>w;
if(w<mmap[u][v])
{
mmap[u][v]=mmap[v][u]=w;
}
}
vis[1]=true;
dijkstra(1);
cout<<dist[n]<<endl;
}
return 0;
}