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;
}
匪夷所思。
#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;
}
相关文章推荐
- POJ2394 Checking an Alibi ——最短路
- POJ2394 Checking an Alibi ——最短路——Pku2394
- POJ2394,Checking an Alibi,Dijkstra单源最短路
- POJ 2394 Checking an Alibi (最短路+Dijkstra)
- POJ2394 Checking an Alibi 基础最短路
- POJ 2394 Checking an Alibi 简单最短路
- POJ 2394 Checking an Alibi(最短路)
- poj 2394 Checking an Alibi
- poj&nbsp;2394&nbsp;Checking&nbsp;an&nbsp;Alibi(dij+h…
- poj 2394 Checking an Alibi--(Dijkstra)
- pku2394 Checking an Alibi
- poj 2394 Checking an Alibi
- Checking an Alibi(最短路径 Dijkstra)
- POJ 2394 Checking an Alibi【SPFA】
- POJ 2394 Checking an Alibi (dijkstra)
- 【BZOJ】1681: [Usaco2005 Mar]Checking an Alibi 不在场的证明(spfa)
- bzoj:1681 [Usaco2005 Mar]Checking an Alibi 不在场的证明
- bzoj 1681: [Usaco2005 Mar]Checking an Alibi 不在场的证明(BFS)
- POJ2394 Checking an Alibi【Dijkstra】
- 【bzoj1689】[Usaco2005 Mar]Checking an Alibi 不在场的证明