您的位置:首页 > 其它

pku2394 Checking an Alibi

2010-03-03 16:46 344 查看
题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2394

题意简述:求一个点能否在规定时间到达另一点。求出所有满足条件的“另一点”。

解题思路:直接求最短路,注意这题有个trick:有重边!

代码:

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int Max=505;
const int INF=1<<29;
int g[Max][Max];
int L[Max];
bool flag[Max];
int main()
{
int f,p,c,m;
while(scanf("%d%d%d%d",&f,&p,&c,&m)!=EOF)
{
for(int i=0;i<=f+1;i++)
{
for(int j=0;j<=f+1;j++) g[i][j]=INF;
L[i]=INF;
}
memset(flag,0,sizeof(flag));
for(int i=1;i<=f;i++) g[i][i]=0;
for(int i=1;i<=p;i++)
{
int s,e,v;
scanf("%d%d%d",&s,&e,&v);
g[s][e]=g[e][s]=min(g[e][s],v);
}
L[1]=0;
for(int i=1;i<f;i++)
{
int Min=INF+1;
int k;
for(int j=1;j<=f;j++)
if(!flag[j]&&L[j]<Min)
{
Min=L[j];
k=j;
}
flag[k]=1;
for(int j=1;j<=f;j++)
if(!flag[j])
L[j]=min(L[j],L[k]+g[k][j]);
}
memset(flag,0,sizeof(flag));
int num[102];
int ans=0;
for(int i=1;i<=c;i++)
{
scanf("%d",&num[i]);
if(L[num[i]]<=m)
{
ans++;
flag[i]=1;
}
}
printf("%d/n",ans);
for(int i=1;i<=c;i++)
if(flag[i]) printf("%d/n",i);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: