zoukankan      html  css  js  c++  java
  • hdu 2807 矩阵运算+最短路

    题意为有N个城市,每个城市用一个矩阵表示,如果三个矩阵A、B、C满足A*B=C,则A到C有一条长度为1的路径,问两个城市间的最短路。这题的最短路部分很简单,稍微麻烦的是矩阵处理。想了一下,觉得优化的矩阵运算不好打,就直接打了个最简单的,AC了,可见杭电OJ的测试数据还是很弱的。这题也WA了一次,原因是以为A*B=B,则A到B也有一条路径,测试表明测试数据中这种情况认为A到B是没有路径的。

    /*
    * hdu2807/win.c
    * Created on: 2011-7-23
    * Author : ben
    */
    #include
    <stdio.h>
    #define SIZE 100
    #define MAX 0x7fffffff
    typedef
    struct {
    int Map[SIZE][SIZE];
    } City;

    int map[SIZE][SIZE];
    City city[SIZE];
    City tempcity;
    int N, M;

    void create(int a, int b) {
    int i, j, k, flag;

    for (i = 0; i < M; i++) {
    for (j = 0; j < M; j++) {
    tempcity.Map[i][j]
    = 0;
    for (k = 0; k < M; k++) {
    tempcity.Map[i][j]
    += city[a].Map[i][k] * city[b].Map[k][j];
    }
    }
    }

    for (k = 0; k < N; k++) {
    if(k == a || k == b) {
    continue;
    }
    flag
    = 0;
    for (i = 0; i < M; i++) {
    if(flag) {
    break;
    }
    for (j = 0; j < M; j++) {
    if (city[k].Map[i][j] != tempcity.Map[i][j]) {
    flag
    = 1;
    break;
    }
    }
    }
    if(!flag) {
    map[a][k]
    = 1;
    }
    }
    }

    void init() {
    int i, j, k;
    for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
    map[i][j]
    = MAX;
    }
    map[i][i]
    = 0;
    }
    for (k = 0; k < N; k++) {
    for (i = 0; i < M; i++) {
    for (j = 0; j < M; j++) {
    scanf(
    "%d", &city[k].Map[i][j]);
    }
    }
    }
    for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
    if (i != j) {
    create(i, j);
    }
    }
    }
    }

    void Floyd() {
    int i, j, k;
    for (k = 0; k < N; k++) {
    for (i = 0; i < N; i++) {
    if (i == k || map[i][k] == MAX) {
    continue;
    }
    for (j = 0; j < N; j++) {
    if (k == j || i == j || map[k][j] == MAX) {
    continue;
    }
    if (map[i][k] < map[i][j] - map[k][j]) {
    map[i][j]
    = map[i][k] + map[k][j];
    }
    }
    }
    }
    }

    void query() {
    int Q, i, j;
    scanf(
    "%d", &Q);
    while (Q--) {
    scanf(
    "%d %d", &i, &j);
    if (map[i - 1][j - 1] < MAX) {
    printf(
    "%d\n", map[i - 1][j - 1]);
    }
    else {
    printf(
    "Sorry\n");
    }
    }
    }

    int main() {
    #ifndef ONLINE_JUDGE
    freopen(
    "data.in", "r", stdin);
    #endif
    while (scanf("%d %d", &N, &M) == 2) {
    if (N + M == 0) {
    break;
    }
    init();
    Floyd();
    query();
    }
    return 0;
    }

      

  • 相关阅读:
    linux线程池简单实例
    OpenCv ROI操作
    OpenCV特征点检测------ORB特征
    opencv中的SIFT,SURF,ORB,FAST 特征描叙算子比较
    OpenCv学习--图像画框标记rectangle
    MATLAB 图片鼠标画框保存
    不错的Django博客
    windows下使用Redis
    前端页面模板bootstrap
    Jenkins启动Tomcat时提示Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
  • 原文地址:https://www.cnblogs.com/moonbay/p/2114896.html
Copyright © 2011-2022 走看看