http://acm.hdu.edu.cn/showproblem.php?pid=4308
题解:
最短路,将p看成一个点
dij()硬是tle 我就奇怪了 最多就5000*5000啊,;最后该的SPFA()1A 。。。。。。。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
using namespace std;
#define maxn 5001
#define inf 999999
#define CL(V,num) memset(V,num,sizeof(V));
char str[maxn][maxn];
int r,c,cost,max1,p,s,e;
int dis[maxn],vis[maxn];
int find(int x,int y)
{
return x*c+y;
}
struct node
{
int k;
int l;
};
vector<node>g[maxn];
int queue[maxn*200+10];
void build()
{
int i,j;
int x,y;
node a;
for(i=0;i<r;i++)
{
for(j=0;j<c;j++)
{
if(str[i][j]!='#')
{
if(str[i][j]=='P')
{
if(p==-1)
p=find(i,j);
x=p;
}
else x=find(i,j);
max1=max1>x?max1:x;
if(str[i][j]=='Y')s=x;
if(str[i][j]=='C')e=x;
if(i-1>=0&&str[i-1][j]!='#')
{
if(str[i-1][j]=='P'&&p==-1)p=find(i-1,j);//将p看成一个点
if(str[i-1][j]=='P'&&p!=-1)y=p;
else
y=find(i-1,j);
a.k=y;
if(str[i-1][j]=='*')
a.l=cost;
else a.l=0;
g[x].push_back(a);
}
if(j+1<c&&str[i][j+1]!='#')
{
if(str[i][j+1]=='P'&&p==-1)p=find(i,j+1);
if(str[i][j+1]=='P'&&p!=-1)y=p;
else
y=find(i,j+1);
a.k=y;
if(str[i][j+1]=='*')
a.l=cost;
else a.l=0;
g[x].push_back(a);
}
if(i+1<r&&str[i+1][j]!='#')
{
if(str[i+1][j]=='P'&&p==-1)p=find(i+1,j);
if(str[i+1][j]=='P'&&p!=-1)y=p;
else y=find(i+1,j);
a.k=y;
if(str[i+1][j]=='*')
a.l=cost;
else a.l=0;
g[x].push_back(a);
}
if(j-1>=0&&str[i][j-1]!='#')
{
if(str[i][j-1]=='P'&&p==-1)p=find(i,j-1);
if(str[i][j-1]=='P'&&p!=-1)y=p;
else
y=find(i,j-1);
a.k=y;
if(str[i][j-1]=='*')
a.l=cost;
else a.l=0;
g[x].push_back(a);
}
}
}
}
}
int SPFA()
{
int i,j,k,min;
node a;
memset(vis,0,sizeof(vis));
for(i=0;i<=max1;i++)dis[i]=inf;
dis[s]=0;
vis[s]=1;
int head=0,tail=0;
queue[head]=s;
tail++;
while(head!=tail)
{
int k=queue[head];
for(i=0;i<g[k].size();i++)
{
node a=g[k][i];
int b=a.k;
if(dis[k]+a.l<dis[b])
{
dis[b]=dis[k]+a.l;
if(!vis[b])
{
vis[b]=1;
queue[tail]=b;
tail++;
if(tail==maxn*200)tail=0;
}
}
}
head++;
if(head==maxn*200)head=0;
}
return dis[e];
}
int main()
{
int i,j;
while(scanf("%d%d%d",&r,&c,&cost)!=EOF)
{
for(i=0;i<=r*c;i++)g[i].clear();
max1=-1;
p=-1;
for(i=0;i<r;i++)
{
scanf("%s",str[i]);
}
build();
int ans=dij();
if(ans==inf)printf("Damn teoy!\n");
else printf("%d\n",ans);
}
}