您的位置:首页 > 其它

pku 2394(最短路径,dijkastra)

2009-12-15 19:14 183 查看
注意重边,多头牛同一位置。

#include <iostream>
#include <vector>
using namespace std;
vector<int> vec;
int map[505][505];           //地图
int dis[505];               //保存最短路径的值
int cow[105];             //保存牛在哪个农场
bool visit[505];         //检查该点是否已访问
int f,p,c,m;
const int inf=999999999;
void dijkastra(){         //dij模板
int min_t,tag;

for(int i=1;i<=f;++i){
dis[i]=map[1][i];
visit[i]=false;
}
visit[1]=true;

for(int i=1;i<=f;++i){
min_t=inf;
for(int j=1;j<=f;++j)
if(!visit[j]&&dis[j]<min_t){
min_t=dis[j];
tag=j;
}
if(min_t==inf) return ;
visit[tag]=true;
for(int j=1;j<=f;++j)
if(!visit[j]&&map[tag][j]<inf&&dis[tag]+map[tag][j]<dis[j])
dis[j]=dis[tag]+map[tag][j];
}
}
int main(){
while (cin>>f>>p>>c>>m)
{
vec.clear();
int a,b,t;
for(int i=1;i<=f;++i)
for(int j=1;j<=f;++j){
map[i][j] = inf;
if(i==j) map[i][j]=0;
}
for(int i=0;i<p;++i){
cin>>a>>b>>t;
if(map[a][b]>t){
map[a][b]=t;
map[b][a]=t;
}
}

for(int i=1;i<=c;++i)
cin>>cow[i];               //input  and  initial

dijkastra();

for(int i=1;i<=c;++i)          //记录可以到达的牛的编号
if(dis[ cow[i] ]<=m) vec.push_back(i);
int size=(int)vec.size();
cout<<size<<endl;
for(int i=0;i<size;++i)
cout<<vec[i]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: