您的位置:首页 > 其它

POJ2394 Checking an Alibi 最短路

2011-09-01 13:06 288 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: