SDUTOJ 2143 图结构练习——最短路径 邻接链表 SPFA算法

来源:互联网 发布:mac必备软件 编辑:程序博客网 时间:2024/06/14 11:16

图结构练习——最短路径

Time Limit: 1000MS Memory limit: 65536K

题目描述

 给定一个带权无向图,求节点1到节点n的最短路径。
 

输入

 输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
 

输出

 每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
 

示例输入

3 21 2 11 3 11 0

示例输出

10

提示

 

来源

 赵利强


#include <stdio.h>#include <string.h>struct node{    int u;    int v;    int w;    node *next;}head[110];bool vis[110];int q[10010];const int inf = 0x3f3f3f3f;void creat(int x,int y,int z){    node *p = &head[x];    while(p->next)    {        if(p->next->v == y)        {            if(p->next->w > z)            {                p->next->w = z;            }            break;        }        p = p->next;    }    if(!p->next)    {        node *r = new node;        r->u = x;        r->v = y;        r->w = z;        r->next = NULL;        p->next = r;    }}void spfa(int s,int e,int n){    memset(vis,false,sizeof(vis));    int tp = 0,tl = 0,t;    int dis[110];    memset(dis,inf,sizeof(dis));    dis[s] = 0;    q[tp++] = s;    vis[s] = true;    while(tl < tp)    {        t = q[tl++];        vis[t] = false;        node *p = head[t].next;        while(p)        {            if(dis[p->v] > dis[p->u] + p->w)            {                dis[p->v] = dis[p->u] + p->w;                if(!vis[p->v])                {                    q[tp++] = p->v;                    vis[p->v] = true;                }            }            p = p->next;        }    }    printf("%d\n",dis[e]);}int main(){    int n,m,x,y,z;    while(~scanf("%d%d",&n,&m))    {        memset(head,0,sizeof(head));        for(int i = 0;i < m;i++)        {            scanf("%d%d%d",&x,&y,&z);            creat(x,y,z);            creat(y,x,z);        }        spfa(1,n,n);    }    return 0;}




0 0
原创粉丝点击