您的位置:首页 > 其它

模板

2016-01-27 10:40 309 查看
本人做题全靠心情,自我感觉一种题通了且有模板可循就总结至这里,不定期更新,注意点一般都写在注释,参考自认为典型题(不是刁难变相题),望诸神不喜轻喷勿拉黑

1、弗洛伊德算法(参考hdu1874)

#include <stdio.h>

#include <string.h>

#include <cstdio>

#include <algorithm>

using namespace std;

const int INF = 1 << 27;

const int N = 1005;

int path

;//路径矩阵

int m, n;  //边数和顶点数

int Min(int a, int b)

{

    return a > b ? b : a;//求最小值,自我感觉写出来方便操作

}

void floyd()

{

    int i, j ,k;

    for(k = 0; k < n; k ++)

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

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

                path[i][j] = Min(path[i][k] + path[k][j], path[i][j]);//具体k的情况可有可无可自定义

}

int main()

{

    int i, j, A, B, C, st, ed;

    while(~scanf("%d%d", &n, &m))

    {

        for(i = 0; i < n; i ++)//初始化,数组下标按照题中范围给出,注意细节

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

            {

                if(i == j) path[i][j] = 0;

                else path[i][j] = path[j][i] = INF;//本题为双向道路,故input赋值操作相当于赋两个值,不同题按照不同赋值方法

            }

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

        {

            scanf("%d%d%d", &A, &B, &C);

            if(path[A][B] > C) path[A][B] = path[B][A] = C;//同上

        }

        floyd();//一般无返回值所以直接void类型出现

        scanf("%d%d", &st, &ed);

        if(path[st][ed] == INF) path[st][ed] = -1;

        printf("%d\n", path[st][ed]);

    }

    return 0;

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