北大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;
}
- 北大2394题
- 北大1002题
- 北大1503题
- 北大1519题
- 北大1517题
- 北大1068题
- 北大2039题
- 北大1484题
- 北大2590题
- 北大2608题
- 北大1047题
- 北大1102题
- 北大1316题
- 北大3268题
- 北大2895题
- 北大2109题
- 北大1328题
- 北大1159题
- Prototype 1.6 边学边译 -- 工具函数 $A
- 挖掘FOR的潜力(5)
- java字符串替换字符串实例
- 什么是Kernel、Shell、Bash 很幽默的解释
- asp.net 开发常见问题及解决方法(一)
- 北大2394题
- 目前觉得比较牛的事情
- C# 对图片进行缩放
- 奥斯卡提名和获奖电影名单
- 谋划(12)
- 北大2895题
- Linux系统信息查看命令大全
- 菜鸟自学Linux之---硬盘安装篇
- woauolt.exe,System.exe,Update.dll,MPKrnl.dll,360mon.dll,upnpsrv.dll等1