最短路
注意有重边
#include<stdio.h>
#include<string.h>
#define M 205
#define INF 0xfffffff
int dis[M];
int G[M][M];
int que[M*M];
bool v[M];
int n,m;
int min(int a,int b)
{
if(a<b) return a;
return b;
}
void SPFA(int u)
{
int l=0,r=0;
int i,p;
memset(v,false,sizeof(v));
for(i=0;i<n;i++)
dis[i]=INF;
que[r++]=u;
dis[u]=0;
v[u]=true;
while(l<r)
{
p=que[l++];
v[p]=false;
for(i=0;i<n;i++)
if( dis[i]>dis[p]+G[p][i])
{
dis[i]=dis[p]+G[p][i];
if(!v[i])
{
v[i]=true;
que[r++]=i;
}
}
}
}
int main()
{
int i,j;
int s,t;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
G[i][j]=INF;
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
G[a][b]=G[b][a]=min(G[a][b],c);
}
scanf("%d%d",&s,&t);
SPFA(s);
if(dis[t]!=INF)
printf("%d\n",dis[t]);
else printf("-1\n");
}
return 0;
}
#include<stdio.h>
#include<string.h>
#define M 200
#define INF 0xfffffff
int dis[M];
int G[M][M];
int pre[M];
bool v[M];
int n,m;
int min(int a,int b)
{
if(a<b) return a;
return b;
}
void dijkstra(int u)
{
int i,j,k;
int min;
memset(v,false,sizeof(v));
for(i=0;i<n;i++)
dis[i]=G[u][i];
for(i=0;i<n;i++)
pre[i]=1;
dis[u]=0;
pre[u]=-1;
v[u]=true;
for(i=0;i<n;i++)
{
min=INF;
for(j=0;j<n;j++)
if(!v[j] && dis[j]<min)
{
min=dis[j];
k=j;
}
v[k]=true;
for(j=0;j<n;j++)
if(!v[j] && dis[j]>dis[k]+G[k][j])
{
dis[j]=dis[k]+G[k][j];
pre[j]=k;
}
}
}
void PrintPath(int e)
{
if(pre[e]!=-1)
PrintPath(pre[e]);
printf("%d ",e);
}
int main()
{
int i,j;
int s,t;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
G[i][j]=INF;
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
G[a][b]=min(G[a][b],c);
G[b][a]=min(G[a][b],c);
}
scanf("%d%d",&s,&t);
dijkstra(s);
if(dis[t]!=INF)
printf("%d\n",dis[t]);
else printf("-1\n");
//PrintPath(n);
}
return 0;
}