您的位置:首页 > 其它

最短路径(Dijkstra算法)也就是单源点问题!

2017-03-08 10:23 302 查看
/*Sample Input

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

Sample Output

90
*/

#include<stdio.h>
#include<string.h>
#define N 1005
#define INF 0x3f3f3f
bool s
;
int d
;
int path
;//辅助记录经过的路程
int map

;//边权值
int n,m;
void Dijkstra(int v0)
{
int v,w,i;
for(v=0;v<n;++v)//这里最好是从1开始,因为我们赋值时的结点都是从1开始的,
{                 //弄不好就容易出问题!!!
s[v]=false;
d[v]=map[v0][v];

if(d[v]<INF)
path[v]=v0;
else
path[v]=-1;
}

s[v0]=true;
d[v0]=0;

for(i=1;i<n;++i)
{
int min=INF;

for(w=0;w<n;++w)
{
if(!s[w]&&d[w]<min)
{
v=w;
min=d[w];
}
}
s[v]=true;
for(w=0;w<n;++w)
{
if(!s[w]&&(d[v]+map[v][w])<d[w])
{
d[w]=d[v]+map[v][w];
path[w]=v;

}
}
}

}
void read()
{
int i,j;
int a,b,x;
memset(map,INF,sizeof(map));
for(i=0;i<m;++i)
{
scanf("%d%d%d",&a,&b,&x);
if(x<map[a-1][b-1])
{
map[a-1][b-1]=x;
map[b-1][a-1]=x;
}

}

}
int main()
{
while(~scanf("%d%d",&n,&m))
{
read();
Dijkstra(0);
printf("%d\n",d[n-1]);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: