九度 OJ 1162 I Wanna Go Home

有一句话不是很懂,看了前辈的代码,学习了。

#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;
}



猜你喜欢

转载自blog.csdn.net/xp1994816/article/details/52474458