题目大意:给出n个城市 ,给出m对城市之间的距离,再给出每一个城市的所属的阵营,要求求出从城市1到城市2的最小的路径长度,城市1总是属于阵营1的,城市2是属于阵营2的。这条路径上最多只有一次从不同阵营穿过的路径,其实城市1属于阵营1,所有我采用的是把所有阵营2到阵营1的城市的路径长度修改成0,那么我在进行更新的时候,只需要判断当前的cost是否为0,如果是的话,那么我就把continue就行。
#include<iostream>
#include<vector>
using namespace std;
struct node{
int next;
int c;
};
vector<node> edge[602];
int dist[602];
bool mark[602];
int own[602];
int main()
{
int n, m;
while (cin >> n&&n)
{
cin >> m;
for (int i = 1; i <= n; i++)
{
edge[i].clear();
dist[i] = -1;
mark[i] = false;
}
for (int i = 1; i <= m; i++)
{
node tmp;
int s, t, c;
cin >> s >> t >> c;
tmp.next = t;
tmp.c = c;
edge[s].push_back(tmp);
tmp.next = s;
edge[t].push_back(tmp);
}
for (int i = 1; i <= n; i++)
{
cin >> own[i];
}
for (int i = 1; i <= n; i++)
{
if (own[i] == 2)
{
for (int j = 0; j < edge[i].size(); j++)
{
if (own[edge[i][j].next] == 1)
edge[i][j].c = 0;
}
}
}
int newop = 1;
dist[newop] = 0;
mark[newop] = true;
for (int i = 1; i < n; i++)
{
for (int j = 0; j < edge[newop].size(); j++)
{
int t = edge[newop][j].next;
int c = edge[newop][j].c;
if (mark[t])
continue;
if (c == 0)//这里如果少了会出错第三个案例会出现错误的答案
continue;//阵营2到阵营1的路径设为不可到达,我在这是把边权值设为0办法,求最短路时判0跳过。
if (dist[t] == -1 || dist[t] > dist[newop] + c)
dist[t] = dist[newop] + c;
}
int min = 123123123;
for (int j = 1; j <= n; j++)
{
if (mark[j])
continue;
if (dist[j] == -1)
continue;
if (dist[j] < min){
min = dist[j];
newop = j;
}
}
mark[newop] = true;
}
cout << dist[2] << endl;
}
return 0;
}
/**************************************************************
Problem: 1162
User: hellosyqq
Language: C++
Result: Accepted
Time:20 ms
Memory:1672 kb
****************************************************************/