题解 | #I Wanna Go Home#
I Wanna Go Home
https://www.nowcoder.com/practice/0160bab3ce5d4ae0bb99dc605601e971
#include<iostream>
#include<algorithm>
const int MAX = 1024;
const int INF = 1e9;
class Solution
{
public:
int n;
int G[MAX][MAX];
int position[MAX];
bool visit[MAX];
int d[MAX];
Solution(int n1)
: n(n1)
{
std::fill(visit, visit+MAX, false);
std::fill(position, position+MAX, -1);
std::fill(d, d+MAX, INF);
d[1] = 0;
//注意对二维数组的初始化
std::fill(G[0], G[0]+MAX*MAX, INF);
}
void Dijkstra()
{
for(int i=0;i<n;i++)
{
int u = -1, min = INF;
for(int j=1;j<=n;j++)
{
if(!visit[j] && d[j] < min)
{
u = j;
min = d[j];
}
}
if(u == -1) return;
visit[u] = true;
for(int j=1;j<=n;j++)
{
//加一个限制条件,只准从1到2,不准从2到1
if(!(position[u]==2 && position[j]==1))
{
if(!visit[j] && G[u][j]!=INF && d[u]+G[u][j] < d[j])
{
d[j] = d[u]+G[u][j];
}
}
}
}
}
};
int main()
{
int n, m;
while (std::cin >> n)
{
if(n==0) break;
std::cin >> m;
Solution* s = new Solution(n);;
for(int i=0;i<m;i++)
{
int A, B, T;
std::cin >> A >> B >> T;
if(s->G[A][B] > T)
{
s->G[A][B] = T;
s->G[B][A] = T;
}
}
for(int i=1;i<=n;i++)
{
std::cin >> s->position[i];
}
s->Dijkstra();
if(s->d[2]!=INF)
std::cout << s->d[2] << std::endl;
else
std::cout << -1 << std::endl;
delete s;
}
}
腾讯公司福利 1143人发布