/*
模版题,,不过还是wa好多次,郁闷,,原来是题目两个点之间可以修很多条路,选最短的,然后DIJKSTRA就OK
*/
#include <stdio.h>
#include <string.h>
#define MAXN 200
#define inf 9999999
typedef int elem_t;
/*套了zju的o(∩_∩)o */
void dijkstra(int n,elem_t mat[][MAXN],int s,elem_t* min,int* pre){
int v[MAXN],i,j,k;
for (i=0;i<n;i++)
min[i]=inf,v[i]=0,pre[i]=-1;
for (min[s]=0,j=0;j<n;j++){
for (k=-1,i=0;i<n;i++)
if (!v[i]&&(k==-1||min[i]<min[k]))
k=i;
for (v[k]=1,i=0;i<n;i++)
if (!v[i]&&min[k]+mat[k][i]<min[i])
min[i]=min[k]+mat[pre[i]=k][i];
}
}
int main()
{
int n,m,a,b,x,s,t,i,j;
elem_t mat[MAXN][MAXN];
elem_t min[MAXN],pre[MAXN];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;++i)
for(j=0;j<n;++j)
mat[i][j]=inf;
for(i=0;i<m;++i)
{
scanf("%d%d%d",&a,&b,&x);
if(mat[a][b]>x)
{
mat[a][b]=x;
mat[b][a]=x;
}
}
scanf("%d%d",&s,&t);
dijkstra(n,mat,s,min,pre);
if(min[t]==inf)printf("%d\n",-1);
else printf("%d\n",min[t]);
}
return 0;
}
闲的没事做,,,自己也写了个dijkstra
#include <stdio.h>
#define NUM 200
#define inf 1000000
void dijkstra(int n,int s,int mat[NUM][NUM],int *dist,int *prev)
{
int v[NUM],i,j,u,min;
for(i=0;i<n;++i)
{
dist[i]=mat[s][i];
v[i]=0;
if(i!=s && dist[i]<inf)prev[i]=s;
else prev[i]=-1;
}
v[s]=1;dist[s]=0;
for(i=0;i<n-1;++i)
{
min=inf;
u=s;
for(j=0;j<n;++j)
{
if(!v[j] && dist[j]<min)
{
min=dist[j];
u=j;
}
}
v[u]=1;
for(j=0;j<n;++j)
{
if(!v[j] && mat[u][j]<inf && dist[u]+mat[u][j]<dist[j])
{
dist[j]=dist[u]+mat[u][j];
prev[j]=u;
}
}
}
}
int main()
{
int mat[NUM][NUM],dist[NUM],prev[NUM];
int n,m,s,t,a,b,c,i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;++i)
for(j=0;j<n;++j)
mat[i][j]=inf;
for(i=0;i<m;++i)
{
scanf("%d%d%d",&a,&b,&c);
if(mat[a][b]>c)
{
mat[a][b]=mat[b][a]=c;
}
}
scanf("%d%d",&s,&t);
dijkstra(n,s,mat,dist,prev);
if(dist[t]==inf)printf("-1\n");
else printf("%d\n",dist[t]);
}
return 0;
}