【发布时间】:2021-06-30 10:34:13
【问题描述】:
这是一个很常见的问题,我尝试阅读解决方案,但似乎都没有解决我的问题。这是我写的代码,我知道它很乱,因为我是 C++ 的新手。
#include<iostream>
#include<string>
#include<iomanip>
#include<set>
#include<queue>
#include<cmath>
#include<algorithm>
#include<vector>
#include<limits.h>
#include<math.h>
#include<map>
#include<cstring>
using ll = long long;
const int N = 2e6+6;
int main(){
std::ios_base::sync_with_stdio(0);
std::cin.tie(0);
int n,m;
std::cin >> n >> m;
std::vector<std::array<int,3>> edges;
int exist[n][n];
memset(exist,0,sizeof(exist));
for(int i = 0; i < m;++i){
int a,b;
char c;
std::cin >> a >> b >> c;
--a,--b;
edges.push_back({a,b,c-'a'});
exist[a][b] = exist[b][a] = 1;
}
std::vector<int> adj[N];
std::map<std::pair<int,int>,int> nodes;
int node = 0;
for(int i = 0; i < m;++i){
for(int j = 0; j < m;++j){
if(i == j)
continue;
if(edges[i][2] != edges[j][2])
continue;
int a = edges[i][0];
int b = edges[i][1];
int c = edges[j][0];
int d = edges[j][1];
if(nodes[{a,c}] == 0)
nodes[{a,c}] = ++node;
if(nodes[{b,d}] == 0)
nodes[{b,d}] = ++node;
if(nodes[{a,d}] == 0)
nodes[{a,d}] = ++node;
if(nodes[{b,c}] == 0)
nodes[{b,c}] = ++node;
adj[nodes[{a,c}]].push_back(nodes[{b,d}]);
adj[nodes[{b,d}]].push_back(nodes[{a,c}]);
adj[nodes[{a,d}]].push_back(nodes[{b,c}]);
adj[nodes[{b,c}]].push_back(nodes[{a,d}]);
}
}
int start = nodes[{0,n-1}];
int ans = 1e9+7;
std::queue<int> q;
q.push(start);
std::vector<int> dist(node+1,-1);
dist[start] = 0;
std::vector<bool> visited(node+1,false);
visited[start] = true;
auto it = nodes.begin();
while(!q.empty()){
int cur_node = q.front();
q.pop();
for(int i = 0; i < (int)adj[cur_node].size();++i){
int next_node = adj[cur_node][i];
if(!visited[next_node]){
q.push(next_node);
visited[next_node] = true;
dist[next_node] = dist[cur_node] + 1;
}
}
}
for(int i = 0; i < n;++i){
for(int j = 0; j < n;++j){
int node = nodes[{i,j}];
if(node == 0)
continue;
if(dist[node] == -1)
continue;
if(i == j || (exist[i][j] == 1)){
ans = std::min(ans,dist[node]);
}
}
}
if(ans == 1e9+7)
ans = -1;
std::cout << ans << "\n";
}
这个程序甚至在进入 main 之前就给出了分段错误,我尝试使用 gdb,它还说错误在行 int main() 上。我根本不明白发生了什么,我也尝试在 C++ 14 和 C++ 17 上运行该程序,它运行良好,但我使用的是 C++ 11,它编译成功但没有运行。请帮帮我。
【问题讨论】:
-
你的意思是main后面的前两行吗?他们应该关闭 C++ i/o 和 C i/o 之间的同步,对吗?
-
我有点喜欢这样做,因为我可以一次输入所有输入,然后将输出放在一起,这使我检查我的解决方案非常方便。另外,我做有竞争力的编程(好吧,请不要开始),它看起来对大量输入很有帮助。
-
因为当我删除它们时,当我有多个测试用例的输入时,只要我给出输入就会得到输出。是的,这里似乎不需要,但也许
-
int exist[n][n]- C++ doesn't support VLAs。此外,您需要包含<array>和<vector>才能使用std::array和std::vector。我不确定你的编译器是如何编译所有这些而不给出一个错误的...... -
std::vector<int> adj[N]
标签: c++ segmentation-fault g++ main