EOJ 1818

来源:互联网 发布:sql全连接 编辑:程序博客网 时间:2024/04/28 18:20
#include <iostream>#include <algorithm>#include <cstdlib>#include <cstdio>#include <queue>#include <cstring>#include <utility>#include <vector>#include <sstream>#include <set>#define maxn 105#define INF 0x3f3f3f3fusing namespace std;typedef long long LL;int m[maxn][maxn];int d[maxn];int vis[maxn];int cnt[maxn];int num[maxn][maxn];int n;int k;void Dijkstra(){    memset(vis, 0, sizeof(vis));//vis=0标示未确定最短长度,=1标示已经确定    memset(d, INF, sizeof(d));//将最短路径数组初始化为无穷大    memset(cnt, 0, sizeof(cnt));//初始化最短路径数目数组为0    d[1] = 0;//自己对自己的距离为0    cnt[1]=1;//自己对自己的最短距离个数为1    for (int i=0; i<n; i++)    {        int small=INF;//最小值的初值为无穷大        int u = 0;//最小值下标为u        for (int j=1; j<=n; j++)        {            if(!vis[j] && d[j] <= small)                small = d[u = j];//找到比当前最小值更小的那个d值,保存坐标        }        vis[u] = 1;//此时vis[u]表示坐标为u的那个定点的最小值已经找到,放入vis数组中        for (int v=1; v<=n ; v++)        {            if (m[u][v] && !vis[v])//如果u,v中有边并且v的最小值未被确定            {                if (d[v] > d[u] + m[u][v])//如果经过u,dis[v]会更小,则交换                {                    d[v] = d[u] + m[u][v];                    cnt[v] = num[u][v] * cnt[u];//如果发现新的路径就更新cnt                }else if (d[v] == d[u] + m[u][v])                {                    cnt[v] += cnt[u] * num[u][v];//如果发现一条和原来长度相同的路径,就个数相加                }            }        }    }}int main(){    scanf("%d%d", &n, &k);    int u;    int v;    int w;    memset(m, 0, sizeof(m));//初始化保存路径长度的二维数组    for (int i=0; i<k; i++)    {        scanf("%d%d%d", &u, &v, &w);        m[u][v] = w;        num[u][v]++;//u和v中有路径,路径个数加1    }    Dijkstra();//调用函数    if (d[n] == INF)//如果不存在最短路径    {        printf("-1 0\n");    }else    {        printf("%d %d\n", d[n], cnt[n]);    }    return 0;
}
本题基本为调用上一题的函数,但是要计算最短路径的个数。每次寻找到比d还要短的路径时候,就要更替cnt的值,如果找到与d相等的路径,则要加上本次找到的路径个数。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝买东西限购怎么办 淘宝被别人登录怎么办 淘宝被厂家投诉怎么办 买家退货说是假货怎么办 同行给差评怎么办 被买家举报了怎么办 淘宝商品被屏蔽怎么办 电脑处于离线状态怎么办 计算机处于离线状态怎么办 交易猫安全提醒怎么办 网吧进游戏代码怎么办 车票冲突买不了怎么办 苹果8淘宝打不开怎么办 我的淘宝打不开怎么办 福袋不支持退货怎么办 不支持跨区下单怎么办 支付宝被占用怎么办 淘宝东西失效了怎么办 访客突然下降了怎么办 淘宝店铺广告违规怎么办 苹果手机网速差怎么办 支付宝账号忘记怎么办 支付宝无法登录怎么办 什么是淘宝空间不足怎么办 支付宝授权失败怎么办 买家旺旺被打标一次怎么办 淘宝网上忘记密码怎么办 登淘宝忘记密码怎么办 手机淘宝闪退怎么办 证券账户忘了怎么办 资金账户忘了怎么办 公积金账户忘了怎么办 淘宝买家号违规怎么办? 淘宝号显示违规怎么办 淘宝网登录不了怎么办 支付宝刷脸登录失败怎么办 blue超出注册限制怎么办 电脑不识别光盘怎么办 4g按钮打不开怎么办 我电脑没有光驱怎么办 电脑360浏览器打不开怎么办