图结构练习——最短路径
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给定一个带权无向图,求节点1到节点n的最短路径。
输入
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
输出
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
示例输入
3 2 1 2 1 1 3 1 1 0
示例输出
1 0
提示
来源
赵利强
示例程序
#include <stdio.h>
#define MAX 1000000007
int vi[100],q[4000],map[100][100],d[100];
void spfa(int n)
{
int i,f=0,top=0;
for(i=0;n>i;i++)
{
d[i]=MAX;
vi[i]=0;
}
d[0]=0;
vi[0]=1;
q[top]=0;
top++;
while(f<top)
{
vi[q[f]]=0;
for(i=0;n>i;i++)
{
if(d[i]>d[q[f]]+map[q[f]][i])
{
d[i]=d[q[f]]+map[q[f]][i];
if(vi[i]==0)
{
q[top]=i;
top++;
vi[i]=1;
}
}
}
f++;
}
}
int main()
{
int n,m,i,i1,u,v,w;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i=0;n>i;i++)
{
for(i1=0;n>i1;i1++)
{
if(i==i1)
{
map[i][i1]=0;
}
else
{
map[i][i1]=MAX;
}
}
}
for(i=1;m>=i;i++)
{
scanf("%d %d %d",&u,&v,&w);
if(map[u-1][v-1]>w)
{
map[u-1][v-1]=w;
map[v-1][u-1]=w;
}
}
spfa(n);
printf("%d\n",d[n-1]);
}
return 0;
}
/**************************************
Problem id : SDUT OJ 2143
Code Len : 1345B
Result : Accepted
Take Memory : 332K
Take Time : 10MS
Submit Time : 2016-07-18 17:48:20
**************************************/