帮同学调个程序,一看题目不难,自己就试着做了一下,最短路的题目,稍微变换一点,就弱弱的错了n遍,太纠结了,写篇博客纪念一下这迟迟到来的AC。。。
1、http://acm.hdu.edu.cn/showproblem.php?pid=1596
2、题目分析
其实这道题目就是简单地dijkstra,原来的加法得换成乘法,初始值也有所变化,就这么弱弱的错了n遍
AC代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 1015
double map[N][N];
double dist[N];
int vis[N];
void dijstra(int v,int n)
{
//memset(dist,-1,sizeof(dist));
for(int i=1; i<=n; i++)
dist[i]=0;
for(int i=1; i<=n; i++)
{
//dist[i]=map[v][i];
vis[i]=0;
}
vis[v]=1;
dist[v]=1;
for(int ii=1; ii<=n; ii++)
{
double minn=0;
int u=v;
for(int i=1; i<=n; i++)
{
if(dist[i]>minn && vis[i]==0)
{
minn=dist[i];
u=i;
}
}
vis[u]=1;
for(int i=1; i<=n; i++)
{
if( vis[i]==0 )
{
double newdist=dist[u]*map[u][i];
if(newdist>dist[i])
dist[i]=newdist;
}
}
}
}
int main()
{
int n,Q,s,e;
while(scanf("%d",&n)!=EOF)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
scanf("%lf",&map[i][j]);
//if(map[i][j]==0)
//map[i][j]=INF;
//printf("%.3f ",map[i][j]);
}
}
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d",&s,&e);
dijstra(s,n);
if(dist[e])
{
printf("%.3f\n",dist[e]);
}
else
printf("What a pity!\n");
}
}
return 0;
}
另一种处理方式,如不注意vis[v]=1,这样赋值了,就会run time error
改正后的AC代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 1015
double map[N][N];
double dist[N];
int vis[N];
void dijstra(int v,int n)
{
//memset(dist,-1,sizeof(dist));
for(int i=1; i<=n; i++)
dist[i]=0;
for(int i=1; i<=n; i++)
{
dist[i]=map[v][i];
vis[i]=0;
}
//标记了vis[v]=1,就会越界
//vis[v]=1;
//初始值是0表示无法到达,所以初始值是1
dist[v]=1;
for(int ii=1; ii<=n; ii++)
{
double minn=0;
int u;
for(int i=1; i<=n; i++)
{
if(dist[i]>minn && vis[i]==0)
{
minn=dist[i];
u=i;
}
}
vis[u]=1;
for(int i=1; i<=n; i++)
{
if( vis[i]==0 )
{
double newdist=dist[u]*map[u][i];
if(newdist>dist[i])
dist[i]=newdist;
}
}
}
}
int main()
{
int n,Q,s,e;
while(scanf("%d",&n)!=EOF)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
scanf("%lf",&map[i][j]);
//if(map[i][j]==0)
//map[i][j]=INF;
//printf("%.3f ",map[i][j]);
}
}
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d",&s,&e);
dijstra(s,n);
if(dist[e])
{
printf("%.3f\n",dist[e]);
}
else
printf("What a pity!\n");
}
}
return 0;
}
vis[v]可以标记成1,越界是u导致的
附AC代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 4015
double map[N][N];
double dist[N];
int vis[N];
void dijstra(int v,int n)
{
//memset(dist,-1,sizeof(dist));
for(int i=1; i<=n; i++)
dist[i]=0;
for(int i=1; i<=n; i++)
{
dist[i]=map[v][i];
vis[i]=0;
}
vis[v]=1;
//初始值是0表示无法到达,所以初始值是1
dist[v]=1;
for(int ii=1; ii<n; ii++)
{
double minn=0;
int u;
for(int i=1; i<=n; i++)
{
if(dist[i]>minn && vis[i]==0)
{
minn=dist[i];
u=i;
}
}
//printf("u=%d\n",u);
//得判断minn的值,如果找不到minn,那么u就会是任意值,可能越界
if(minn==0)
break;
vis[u]=1;
for(int i=1; i<=n; i++)
{
if( vis[i]==0 )
{
double newdist=dist[u]*map[u][i];
if(newdist>dist[i])
dist[i]=newdist;
}
}
}
}
int main()
{
int n,Q,s,e;
while(scanf("%d",&n)!=EOF)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
scanf("%lf",&map[i][j]);
//if(map[i][j]==0)
//map[i][j]=INF;
//printf("%.3f ",map[i][j]);
}
}
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d",&s,&e);
dijstra(s,n);
if(dist[e])
{
printf("%.3f\n",dist[e]);
}
else
printf("What a pity!\n");
}
}
return 0;
}