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;
}