POJ2394 Checking an Alibi 最短路

floyd算法去处理。但是至今还搞不明白为什么output limit exceed。。。。。。。。

匪夷所思。

#include<iostream>

using namespace std;
const int F=605,P=1005,M=70005,C=105;
int f,p,c,m;
int mat[F][F];
const int inf=(1<<29);
int ans[F];
void floyd()
{
for(int k=1;k<=f;k++)
for(int i=1;i<=f;i++)
for(int j=1;j<=f;j++)
{
if(mat[i][j]>mat[i][k]+mat[k][j])
mat[i][j]=mat[i][k]+mat[k][j];
}
}
int main()
{
//freopen("C:\\Users\\wuyanyisb\\Desktop\\1.txt","r",stdin);
scanf("%d%d%d%d",&f,&p,&c,&m);
int a,b,c;
for(int i=1;i<=f;i++)
for(int j=i+1;j<=f;j++)
{
mat[i][j]=mat[j][i]=inf;
}
for(int i=1;i<=p;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<mat[a][b])
mat[a][b]=mat[b][a]=c;
}
floyd();
int k=0;
for(int i=1;i<=c;i++)
{
scanf("%d",&a);
if(mat[1][a]<=m)
{
ans[k++]=i;
}
}
printf("%d\n",k);
for(int i=0;i<k;i++)
{
printf("%d\n",ans[i]);
}
return 0;

}

重新用dijstra算法写了一下,还是ole。老天,这是为啥?

#include<iostream>
#include<algorithm>
using namespace std;
const int F=605,P=1005,M=70005,C=105;
int f,p,c,m;
int mat[F][F];
const int inf=(1<<29);
int ans[F];
int dis[F];
bool visit[F];
void floyd()
{
for(int k=1;k<=f;k++)
for(int i=1;i<=f;i++)
for(int j=1;j<=f;j++)
{
if(mat[i][j]>mat[i][k]+mat[k][j])
mat[i][j]=mat[i][k]+mat[k][j];
}
}
void dijsk()
{
memset(visit,0,sizeof(visit));
for(int i=2;i<=f;i++)
dis[i]=inf;
dis[1]=0;
visit[1]=true;
int now=1;
for(int i=1;i<=f-1;i++)
{
int min=inf,k=0;
for(int j=2;j<=f;j++)
{
if(!visit[j])
{
if(mat[now][j]!=inf&&mat[now][j]+dis[now]<dis[j])
{
dis[j]=mat[now][j]+dis[now];
}
if(dis[j]<min)
{
min=dis[j];
k=j;
}
}
}
if(k!=0)
{
now=k;
visit[now]=true;
}
}
}
int main()
{
scanf("%d%d%d%d",&f,&p,&c,&m);
int a,b,c;
for(int i=1;i<=f;i++)
for(int j=i+1;j<=f;j++)
{
mat[i][j]=mat[j][i]=inf;
}
for(int i=1;i<=p;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c<mat[a][b])
mat[a][b]=mat[b][a]=c;
}
//floyd();
dijsk();
int k=0;
for(int i=1;i<=c;i++)
{
int pos;
scanf("%d",&pos);
if(dis[pos]<=m)
{
ans[k++]=i;
}
}
sort(ans,ans+k);
printf("%d\n",k);
for(int i=0;i<k;i++)
printf("%d\n",ans[i]);
return 0;
}


终于知道原因了!!!

#include<iostream>
#include<algorithm>
using namespace std;
const int F=605,P=1005,M=70005,C=105;
int f,p,c,m;
int mat[F][F];
const int inf=(1<<29);
int ans[F];
int dis[F];
bool visit[F];
void floyd()
{
for(int k=1;k<=f;k++)
for(int i=1;i<=f;i++)
for(int j=1;j<=f;j++)
{
if(mat[i][j]>mat[i][k]+mat[k][j])
mat[i][j]=mat[i][k]+mat[k][j];
}
}
void dijsk()
{
memset(visit,0,sizeof(visit));
for(int i=2;i<=f;i++)
dis[i]=inf;
dis[1]=0;
visit[1]=true;
int now=1;
for(int i=1;i<=f-1;i++)
{
int min=inf,k=0;
for(int j=2;j<=f;j++)
{
if(!visit[j])
{
if(mat[now][j]!=inf&&mat[now][j]+dis[now]<dis[j])
{
dis[j]=mat[now][j]+dis[now];
}
if(dis[j]<min)
{
min=dis[j];
k=j;
}
}
}
if(k!=0)

now=k;
visit[now]=true;
}
}
}
int main()
{
scanf("%d%d%d%d",&f,&p,&c,&m);
int a,b,w;//这里本来是int a,b,c;这里的c和牛的数量的c冲突了!!泪流满面!一定要吸取这个教训。
for(int i=1;i<=f;i++)
for(int j=i+1;j<=f;j++)
{
mat[i][j]=mat[j][i]=inf;
}
for(int i=1;i<=p;i++)
{
scanf("%d%d%d",&a,&b,&w);
if(w<mat[a][b])
mat[a][b]=mat[b][a]=w;
}
floyd();
//dijsk();
int k=0;
for(int i=1;i<=c;i++)
{
int pos;
scanf("%d",&pos);
//if(dis[pos]<=m)
if(mat[1][pos]<=m)
{
ans[k++]=i;
}
}
printf("%d\n",k);
for(int i=0;i<k;i++)
printf("%d\n",ans[i]);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值