http://acm.hdu.edu.cn/showproblem.php?pid=2145
题意:m个人,n个城市,k条路径;zz在p城市。
相同的到达时间,看最短距离的长度(更长);如果时间+距离都相同,礼物就给编号最大的孩纸
分析:细心处理ing,为什么总在我以为过不了的时候过了,也不知道这神一样的bug是怎么调试出来的~~
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=305;
const int MAX=0xfffffff;
int a[NM][NM],dis[NM],pos[NM],sp[NM],n,mmin;
bool vis[NM];
void Dijkstra(int s)
{
int i,j,u;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++) dis[i]=a[s][i];
dis[s]=0;vis[s]=true;
for(j=1;j<n;j++)
{
mmin=MAX;
for(i=1;i<=n;i++){
if(!vis[i] && mmin>dis[i]){
u=i;mmin=dis[i];
}
}
if(mmin==MAX) break;
vis[u]=true;
for(i=1;i<=n;i++){
if(!vis[i] && dis[u]+a[u][i]<dis[i]){
dis[i]=dis[u]+a[u][i];
}
}
}
}
int main()
{
int i,j,m,k,num,x,y,vau,s;
while(~scanf("%d%d%d",&n,&m,&k)){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
a[i][j]=MAX;
}
}
for(i=0;i<k;i++){
scanf("%d%d%d",&x,&y,&vau); //反向
if(vau<a[y][x]) a[y][x]=vau;
}
scanf("%d",&s);
Dijkstra(s);
for(i=1;i<=m;i++) scanf("%d",&pos[i]);
for(i=1;i<=m;i++) scanf("%d",&sp[i]);
double temp=MAX;
for(i=1;i<=m;i++){
if(dis[pos[i]]>=MAX) continue;
double t=(double)dis[pos[i]]/sp[i];
if(t<temp){
num=i;temp=t;
}
else if(t==temp){
if(dis[pos[i]]>=dis[pos[num]]) // >= :号码
num=i;
}
}
if(temp==MAX) printf("No one\n");
else printf("%d\n",num);
}
return 0;
}