Submission #352524


Source Code Expand

#include <iostream>
#include <immintrin.h>

using namespace std;

int N, M;
int d[420][420] __attribute__((aligned(32)));

int K;

int main()
{
  while (cin >> N >> M)
  {
    for (int i = 0; i <= 400; i++) {
      for (int j = 0; j <= 400; j++) {
        d[i][j] = 1<<28;
      }
      d[i][i] = 0;
    }

    for (int i = 0; i < M; i++)
    {
      int a, b, c;
      cin >> a >> b >> c;
      --a;
      --b;
      d[a][b] = d[b][a] = c;
    }

    // for (int k = 0; k < N; k++) {
    //   for (int i = 0; i < N; i++) {
    //     for (int j = 0; j < N; j++) {
    //       d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
    //     }
    //   }
    // }

    for (int k = 0; k < N; k++)
    {
      for (int i = 0; i < N; i++)
      {
        int j = 0;

        // ik = {d[i][k], d[i][k], d[i][k], d[i][k]}
        __m128i ik = _mm_set_epi32(d[i][k], d[i][k], d[i][k], d[i][k]);

        for (;j<N;j+=4)
        {
          // やること
          // d[i][j] に最小値をセットする
          // base = {d[i][j], d[i][j+1], d[i][j+2], d[i][j+3]}
          __m128i base = _mm_load_si128((__m128i*)(d[i] + j));
          // fact = {d[k][j], d[k][j+1], d[k][j+2], d[k][j+3]}
          __m128i fact = _mm_load_si128((__m128i*)(d[k] + j));
          fact = _mm_add_epi32(fact, ik);
          base = _mm_min_epi32(base, fact);
          d[i][j] = _mm_extract_epi32(base, 0);
          d[i][j+1] = _mm_extract_epi32(base, 1);
          d[i][j+2] = _mm_extract_epi32(base, 2);
          d[i][j+3] = _mm_extract_epi32(base, 3);
        }

        for (;j<N;j++)
        {
          d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
        }
      }
    }

    cin >> K;

    while (K--)
    {
      int x, y, z;
      cin>>x>>y>>z;

      --x;
      --y;

      for (int i = 0; i < N; i++)
      {
        for (int j = 0; j < N; j++)
        {
          d[i][j] = min(d[i][j], d[i][x] + z + d[y][j]);
          d[i][j] = min(d[i][j], d[i][y] + z + d[x][j]);
        }
      }

      long long s = 0;
      for (int i = 0; i < N; i++) {
        for (int j = i+1; j < N; j++) {
          s += d[i][j];
        }
      }

      cout << s << endl;

    }

  }
  return 0;
}

Submission Info

Submission Time
Task C - アットコーダー王国の交通事情
User brly
Language C++11 (Clang++ 3.4)
Score 0
Code Size 2268 Byte
Status CE

Compile Error

./Main.cpp:57:18: error: use of undeclared identifier '_mm_min_epi32'; did you mean '_mm_min_epi16'?
          base = _mm_min_epi32(base, fact);
                 ^~~~~~~~~~~~~
                 _mm_min_epi16
/usr/bin/../lib/clang/3.4/include/emmintrin.h:703:1: note: '_mm_min_epi16' declared here
_mm_min_epi16(__m128i __a, __m128i __b)
^
./Main.cpp:58:21: error: use of undeclared identifier '_mm_extract_epi32'; did you mean '_mm_extract_epi16'?
          d[i][j] = _mm_extract_epi32(base, 0);
                    ^~~~~~~~~~~~~~~~~
                    _mm_extract_epi16
/usr/bin/../lib/clang/3.4/include/emmintrin.h:1266:1: note: '_mm_extract_epi16' declared here
_mm_extract_epi16(__m128i __a, int __imm)
^
./Main.cpp:59:23: error: use of undeclared identifier '_mm_extract_epi32'; did you mean '_mm_extract_epi16'?
          d[i][j+1] = _mm_extract_epi32(base, 1);
                      ^~~~~~~~~~~~~~~~~
                      _mm_extract_epi16
/usr/bin/../lib/clang/3.4/include/emmintrin.h:1266:1: note: '_mm_extract_epi...