dijkstra 求两点最短路的权值和
No1:
#include<cstdio>
#include<cstring>
#define find_min(a,b) a<b?a:b
using namespace std;
const int MAX = 0xfffffff;
const int N = 210;
int n,m,map[N][N],dist[N],vis[N];
void getmap()
{
int i,j,a,b,c;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
map[i][j] = (i==j?0:MAX);
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=find_min(map[a][b],c);
}
}
void dij(int start,int to)
{
int i,cur,next;
for(i=0;i<n;dist[i++]=MAX);
dist[start]=0;
cur=start;
while(1){
vis[cur]=1;
int min=MAX;
for(i=0;i<n;i++){
if(vis[i])continue;
if(dist[i]-map[i][cur]>dist[cur])
dist[i]=map[i][cur]+dist[cur];
if(dist[i]<min){
min=dist[i]; next=i;
}
}
cur=next;
if(cur==to)break;
if(min==MAX)break;
}
printf("%d\n",dist[to]<MAX?dist[to]:-1);
}
int main()
{
int sp,ep;
while(~scanf("%d%d",&n,&m))
{
getmap();
scanf("%d%d",&sp,&ep);
dij(sp,ep);
}
return 0;
}