I wanna go home

来源:互联网 发布:win8.1装ubuntu双系统 编辑:程序博客网 时间:2024/05/22 05:20

题目网址:I wanna go home

题目大意:给出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: 1162User: hellosyqqLanguage: C++Result: AcceptedTime:20 msMemory:1672 kb****************************************************************/


原创粉丝点击