hdoj 1874 畅通工程续 【最短路径】

来源:互联网 发布:gpu优化工程师 编辑:程序博客网 时间:2024/06/05 10:14

畅通工程续

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 31423    Accepted Submission(s): 11469


Problem Description
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
 

Input
本题目包含多组数据,请处理到文件结束。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
 

Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.
 

Sample Input
3 30 1 10 2 31 2 10 23 10 1 11 2
 

Sample Output
2-1
 
dijkstra算法:
#include<stdio.h>#include<string.h>#define INF 0x3f3f3f#define max 200+10int dist[max],visit[max],map[max][max];int city,road;int start,end;void dijkstra(){    int i,j,next,mindist;    memset(visit,0,sizeof(visit));    for(i=0;i<city;i++)    {        dist[i]=map[start][i];    }    visit[start]=1;    for(i=1;i<city;i++)    {        mindist=INF;        for(j=0;j<city;j++)        {            if(visit[j]==0&&mindist>dist[j])            {                mindist=dist[j];                next=j;            }        }        visit[next]=1;        for(j=0;j<city;j++)        {            if(visit[j]==0&&dist[next]+map[next][j]<dist[j])            {                dist[j]=dist[next]+map[next][j];            }        }    }    if(dist[end]==INF)    printf("-1\n");    else    printf("%d\n",dist[end]);} int main(){    int i,j,x,y,c;    while(scanf("%d%d",&city,&road)!=EOF)    {        for(i=0;i<city;i++)        {            for(j=0;j<city;j++)            {                if(i==j)                map[i][j]=0;                else                map[i][j]=INF;            }        }        while(road--)        {            scanf("%d%d%d",&x,&y,&c);            if(map[x][y]>c)//有重边             {                map[x][y]=map[y][x]=c;            }        }        scanf("%d%d",&start,&end);        dijkstra();    }    return 0;}

floyd算法:
#include<stdio.h>#define INF 0x3f3f3f#define max 200+10int map[max][max];int city,road;int start,end;void floyd(){    int k,i,j;    for(k=0;k<city;k++)    {        for(i=0;i<city;i++)        {            for(j=0;j<city;j++)            {                if(map[i][j]>map[i][k]+map[k][j])                {                    map[i][j]=map[i][k]+map[k][j];                }            }        }    }    if(map[start][end]==INF)    printf("-1\n");    else    printf("%d\n",map[start][end]);} int main(){    int i,j,x,y,c;    while(scanf("%d%d",&city,&road)!=EOF)    {        for(i=0;i<city;i++)        {            for(j=0;j<city;j++)            {                if(i==j)                map[i][j]=0;                else                map[i][j]=INF;            }        }        while(road--)        {            scanf("%d%d%d",&x,&y,&c);            if(map[x][y]>c)            {                map[x][y]=map[y][x]=c;            }        }        scanf("%d%d",&start,&end);        floyd();    }    return 0;}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一岁八个月宝宝不喜欢穿袜子怎么办 未来婆婆给我买衣服我不喜欢怎么办 孩子调皮被同学排斥不想上学怎么办 宝宝出生没人带怎么办自己要上班 孩子上幼儿园一年了还哭怎么办 6年级孩子会认字不会写怎么办 小孩写字没兴趣爱玩玩具怎么办 小学二年级语文记不住生字怎么办 2周半宝宝不肯马桶拉臭臭怎么办 娃晚上不肯睡早上不肯起怎么办 小学一年纪学生做作业粗心怎么办 考完试的题本偷撕了一页怎么办 犯错把父母惹的很生气该怎么办 一年级孩子做题粗心不认真怎么办 作弊被老师发现怎么办抄错了卷子 孩子最近老是被老师罚抄课文怎么办 孩子总是撒谎说作业作完了怎么办 孩子严重挑食怎么办一点菜也不吃 孩子在家很听话在学校很调皮怎么办 没通过交警车主全责不垫付怎么办 开车撞伤人交警说车主全责怎么办 面对喜欢上网又判逆的儿子怎么办 五年级了计算题老是出错怎么办 三年级的孩子老是计算题出错怎么办 写在表上的字写错了怎么办不能涂改 我的孩子做作业很马虎怎么办 幼儿园老师把学生名字写错怎么办 孩子的手写字磨了疙瘩怎么办 我家孩子上一年级算题特慢怎么办 脚注太多导致与正文距离太大怎么办 搜狗输入法打字不显示选字框怎么办 粘贴文字时带自动添加了序号怎么办 电脑上是表字打印出来是坔怎么办 不同颜色的衣服一起洗染色了怎么办 两岁宝宝不爱吃饭怎么办且消瘦 一岁两个月宝宝不爱吃饭怎么办 罗汉鱼头座大颜色不红怎么办 为什么孩子的牙都是龋齿怎么办呀 蓝迪儿童墙膜出现气泡了怎么办 空sd卡或文件系统不受支持怎么办 8个月宝宝吃了纸怎么办