北大2394题

来源:互联网 发布:淘宝网的评价管理在哪 编辑:程序博客网 时间:2024/05/06 00:12

 题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2394

该题主要有两个陷阱:1,图的边可以为重边要求接收输入时进行特别处理,取重边中的最小者;

                                        2,同一个地方可能有多个牛,这一点很重要也很有意思,处理的时候不错。

#include <iostream>
using namespace std;

#define MAX 501
#define INF 80000
struct Graph
{
 int v_num;
 int e_num;
 bool find[MAX];
 int dist[MAX];
 int arc[MAX][MAX];
};


void Dijkstra(Graph& g,int s)
{
 int i,j,k,min;
 for(i = 1;i <= g.v_num;++i)
 {
  g.dist[i] = g.arc[s][i];
  g.find[i] = false;
 }

 g.dist[s] = 0;
 g.find[s] = true;

 for(i = 1;i < g.v_num;++i)
 {
  min = INF;
  for(j = 1;j <= g.v_num;++j)
  {
   if(!g.find[j] && min > g.dist[j])
   {
    min = g.dist[j];
    k = j;
   }
  }

  g.find[k] = true;
  
  for(j = 1;j <= g.v_num;++j)
  {
   if(g.arc[k][j] != INF)
   {
    if(!g.find[j] && g.dist[j] > g.dist[k] + g.arc[k][j])
     g.dist[j] = g.dist[k] + g.arc[k][j];
   }
  }
 }
}

int main()
{
 freopen("in.txt","r",stdin);

 int i,j,m,n,w,C,M,P[MAX];
 Graph g;
 while(cin >> g.v_num >> g.e_num >> C >> M)
 {
  for(i = 1;i <= g.v_num;++i)
  {
   for(j = 1;j <= g.v_num;++j)
    if(i != j)
     g.arc[i][j] = INF;
    else
     g.arc[i][j] = 0;
  }

  for(i = 0;i < g.e_num;++i)
  {
   cin >> m >> n >> w;
   if(w < g.arc[m][n])
    g.arc[n][m] = g.arc[m][n] = w;
  }
  
  Dijkstra(g,1);
  
  m = 0;
  for(i = 1;i <= C;++i)
  {
   cin >> n;
   if(g.dist[n] <= M)
   {
    P[m] = i;
    ++m;
   }
  }

  cout << m << endl;
  for(i = 0;i < m;++i)
   cout << P[i] << endl;
 }
 return 0;
}

原创粉丝点击