第一次接触最短路问题,折腾了一下午,基本框架出来了,可总是卡在一些细节。。。
关键最后还有一个可能有重复路段,需要取其中最小值。。。伤不起
#include<stdio.h>
#include<string.h>
#define mi 9999999
#define min(a,b) (a>b? b:a)
int map[202][202];
int vis[202];
int divs[202];
int ans;
int n,m;
void prim(int b)
{
int k;
for(int j=1; j<n; j++)
{
int min=mi;
for(int i=0; i<n; i++)
if(!vis[i]&&min>divs[i])
{
min=divs[i];
k=i;
}
vis[k]=1;
for(int i=0; i<n; i++)
if(!vis[i]&&divs[k]+map[k][i]<divs[i])
divs[i]=divs[k]+map[k][i];
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
map[i][j]=mi;
map[i][i]=0;
}
int a,b,c;
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=min(map[a][b],c);
map[b][a]=min(map[b][a],c);
}
scanf("%d%d",&a,&b);
for(int i=0; i<n; i++)
divs[i]=map[a][i];
divs[a]=0;
prim(b);
printf("%d\n",divs[b]==mi?-1:divs[b]);
}
return 0;
}
后来,在学习spfa算法的时候,又回头做了这道题。
附上代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int map[202][202];
int vis[202];
int d[202];
int n,m;
int s,e;
void spfa()
{
queue <int> q;
int a;
q.push(s);
for(int i=0; i<n; i++)
d[i]=0x7ffffff;
d[s]=0;
vis[s]=1;
while(!q.empty())
{
a=q.front();
q.pop();
vis[a]=0;
for(int i=0; i<n; i++)
{
if(d[i]>map[a][i]+d[a])
{
d[i]=map[a][i]+d[a];
//printf("**%d %d %d %d\n",i,d[i],map[a][i],d[a]);
if(!vis[i])
{
q.push(i);
vis[i]=1;
}
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int a,b,c;
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
map[i][j]=0x7ffffff;
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=map[a][b]>c?c:map[a][b];
}
scanf("%d%d",&s,&e);
spfa();
if(d[e]==0x7ffffff)
printf("-1\n");
else
printf("%d\n",d[e]);
}
return 0;
}