sicily 1823. Hardest Job Ever!

#include <iostream>        //求顶点1到n的最短距离,Dijkstra算法
#include<stdio.h>
using namespace std;
#define Max 210
#define MaxW 20000
int n,m,edge[Max][Max],S[Max],distD[Max];
void Dijkstra(int v)
{
for(int i=0;i<n;++i)
{
distD[i]
=edge[v][i];
S[i]
=0;
}
S[v]
=1;
for(int i=1;i<n;++i)
{
int min=MaxW,u=0;
for(int j=0;j<n;++j)
if(!S[j]&&distD[j]<min)
{
u
=j;min=distD[j];
}
S[u]
=1;
for(int j=0;j<n;++j)
if(!S[j] && distD[u]+edge[u][j]<distD[j])
distD[j]
=distD[u]+edge[u][j];
}
}
int main()
{
int cases;
scanf(
"%d",&cases);
while(cases--)
{
scanf(
"%d%d",&n,&m);
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
edge[i][j]
=MaxW;
edge[i][i]
=0;
}
int s,t,w;
while(m--)
{
scanf(
"%d%d%d", &s,&t,&w);
if(w<edge[s-1][t-1])
{
edge[s
-1][t-1]=edge[t-1][s-1]=w; //可能有重边
}
}
Dijkstra(
0);
if (distD[n-1]==MaxW)
printf(
"-1\n");
else
printf(
"%d\n",distD[n-1]);
}
return 0;
}

  

posted on 2011-07-16 21:06  sysu_mjc  阅读(206)  评论(0编辑  收藏  举报

导航