模板

来源:互联网 发布:淘宝特价 编辑:程序博客网 时间:2024/05/11 01:48

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

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[N][N];//路径矩阵
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;
}


0 0
原创粉丝点击