【问题标题】:How do you properly accept a square weighted adjacency matrix?您如何正确接受平方加权邻接矩阵?
【发布时间】:2018-08-17 17:12:57
【问题描述】:

我正在尝试重新创建 Kruskal 和 Prim 的算法。为此,我需要输入一个加权邻接矩阵。

加权邻接矩阵的示例输入是:

0   0   355 0   695 0   0   0
0   0   74  0   0   348 0   0
355 74  0   262 0   269 0   0
0   0   262 0   0   242 0   0
695 0   0   0   0   151 0   0
0   348 269 242 151 0   83  306
0   0   0   0   0   83  0   230
0   0   0   0   0   306 230 0

为了更加清晰,这些数字已经过少量编辑。每个数字之间应该有一个空格。

至于接受这些值并记录它们,我可以使用以下代码接受其中的一行:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

int main()
{
        string temp;
        string buf;
        vector<string> matrix;

        cout << "Matrix: ";
        getline(cin, temp);

        stringstream ss(temp);

        while(ss >> buf)
        {
                matrix.push_back(buf);
        }

        for(int i = 0; i < matrix.size(); i++)
        {
                cout << matrix[i] << " ";
        }
        cout << endl;

        return 0;
}

示例输出:

Matrix: 0 0 355 0 695 0 0 0
0 0 355 0 695 0 0 0

关于我的问题,我怎样才能要求正确数量的矩阵线并记录所有它们?

在示例的情况下,我如何再请求 7 行矩阵值(在接受值之前不需要 cout/cin 语句)?

【问题讨论】:

  • 您的问题只是“如何从std::cin 读取7 行”吗? ...
  • 有点像。我需要多读 7 行,但我必须弄清楚要读多少行。
  • 只需让用户给你一些行和列,然后读取所需数量的数据迭代它们。这些提示应该足以完成您的任务。
  • 您的问题与矩阵无关。请花时间适当地抽象您要解决的问题。询问那个问题,一旦你在那里(或进行搜索并找到解决方案)。

标签: c++ stdin


【解决方案1】:

让我们把你已经拥有的东西提取到一个函数中:

std::vector<std::string> read_row(std::istream & is)
{
    string line;
    string number;
    vector<string> row;

    getline(is, line);

    stringstream ss(line);

    while(ss >> number)
    {
         row.push_back(number);
    }
    return row;
}

现在我们可以多次这样做

int main()
{
     std::vector<std::vector<std::string>> matrix;
     std::vector<std::string> first_row = read_row(std::cin);
     matrix.push_back(first_row);
   // We already have the first line, so loop from 1
     for (int i = 1; i < first_row.size(); ++i)
     {
          std::vector<std::string> next_row = read_line(std::cin);
          if (next_row.size() != first_row.size())
          {
               std::cout << "Row " << i << " does not match length";
               return 1;
          }
          matrix.push_back(next_row);
     }
     return 0;
 }

现在您可能想使用数字进行计算,因此您可以使用intdouble 来代替std::stringss &gt;&gt; number 是一个格式化输入,因此它会为您将文本转换为数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2018-07-03
    相关资源
    最近更新 更多