有一句话不是很懂,看了前辈的代码,学习了。
#include <stdio.h>
#include <vector>
using namespace std;
struct E{
int nextNode;
int cost;
};
vector<E> edge[601];
int dis[601];
bool mark[601];
int leader[601];
int main()
{
int n , m;
while(scanf("%d",&n) != EOF && n != 0){
scanf("%d",&m);
for(int i = 1 ; i <= n ; ++i){
edge[i].clear();
dis[i] = -1;
mark[i] = false;
}
for(int i = 1 ; i <= m ; ++i){
int a , b , t;
scanf("%d%d%d",&a,&b,&t);
E tmp;
tmp.nextNode = b;
tmp.cost = t;
edge[a].push_back(tmp);
tmp.nextNode = a;
edge[b].push_back(tmp);
}
for(int i = 1 ; i <= n ;++i){
scanf("%d",&leader[i]);
}
mark[1] = true; //Dijkstra
dis[1] = 0;
int newp = 1;
for(int i = 1 ; i < n ; ++i){
for(int j = 0 ; j < edge[newp].size() ; ++j){
int t = edge[newp][j].nextNode;
int c = edge[newp][j].cost;
if(mark[t] == true) continue;
if(c == -1) continue;
if(leader[newp] == 2 && leader[t] == 1) continue; //跳过从2到1的路线
if(dis[t] == -1 || dis[t] > dis[newp] + c){
dis[t] = dis[newp]+c;
}
}
int min = 501;
for(int j = 1 ; j <= n ; ++j){
if(mark[j] == true) continue;
if(dis[j] == -1) continue;
if(dis[j] < min){
min = dis[j];
newp = j;
}
}
mark[newp] = true;
}
printf("%d\n",dis[2]);
}
return 0;
}