您的位置:首页 > 其它

HDOJ 3790最短路径问题

2014-05-13 17:53 190 查看
#include<stdio.h>

const int MAX=99999;

int d[100005][100005],p[100005][100005]; //两点之间的距离和花费

int lowcost[100005],lowline[100005] ;

int n,m,min,i,j,L,T;

void prim(int s,int t)

{

int min1,min2,k;

T=0,L=0; //T为最少花费, l为最短离

k=s;

for(i=1;i<=n;i++)

{

lowcost[i]=p[k][i];//最小花费

lowline[i]=d[k][i]; //最短距离

}

L=lowline[k]=0;

T=lowcost[k]=0; //将s作为根节点

for(i=1;i<n;i++)

{

min1=min2=MAX;

for(j=1;j<=n;j++)

if(lowline[j]!=0&&lowcost[j]<min&&lowcost[j]!=0&&lowcost[j]<min)

{

k=j;

min1=lowline[j];

min2=lowcost[j];

}

L+=min1;

T+=min2;

lowline[k]=lowcost[k]=0;

for(j=1;j<=n;j++)

if(!lowline[j]&&d[k][j]<lowline[j])

lowline[j]=d[k][j];

}

}

int main()

{

int a,b,w,s,t; //a,b为顶点,s,t为 所要求的起点和终点,w为花费 ,n为顶点,m为边数

while(scanf("%d%d",&n,&m)&&n&&m) //n为顶点数,m为边数

{

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

p[i][j]=MAX;

for(i=0;i<m;i++)

{

scanf("%d %d %d %d",&a,&b,&w); //输入各边及其最短距离

scanf("%d",&p[a][b]);

if(d[a][b]>w)

d[a][b]=d[b][a]=w;

}

scanf("%d %d",&s,&t);//起点和终点

prim(s,t);

printf("%d %d\n",L,T);

}

return 0;



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