poj 1062 昂贵的聘礼 艰难的AC
中文题目竟然理解错了题意
关键点:等级差距大于m的两个人不能直接或间接交易,而1必须是图的终点,所以最短路径中所有的点的等级都必须在【level【1】-m,level【1】+m】之间,所以可以枚举等级限制,
for(i=level[1]-m;i<=level[1];i++)
{
最短路算法且要保证
最短路径中每个点的等级都在【i,i+m】之间
}
就这样,带血的AC总是那么的鼓舞人心
View Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int inf = 1000000000;
int lev[110],p[110];
int map[110][110];
int vis[110];
int dis[110];
int dijkstra(int cost[][110],int n,int x,int m)
{
int i,j,k,minc;
memset(vis,0,sizeof(vis));
dis[0]=0;vis[0]=1;
for(i=1;i<n;i++)dis[i]=cost[0][i];
for(i=1;i<n;i++)
{
minc=inf;
for(j=0;j<n;j++)
if(!vis[j]&&dis[j]<minc)
{
minc=dis[j];
k=j;
}
if(minc==inf) break;
vis[k]=1;
for(j=0;j<n;j++)
if(!vis[j]&&dis[j]>dis[k]+cost[k][j]&&lev[k]>=x&&lev[k]<=x+m)
dis[j]=dis[k]+cost[k][j];
}
return dis[1];
}
int main()
{
int m,n;
int i,j,k,x,price,id;
while(scanf("%d%d",&m,&n)!=EOF)
{
for(i=0;i<=100;i++)
{
map[i][i]=0;
for(j=i+1;j<=100;j++)
{
map[i][j]=map[j][i]=inf;
}
}
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&p[i],&lev[i],&x);
for(j=1;j<=x;j++)
{
scanf("%d%d",&id,&price);
map[id][i]=price;
}
}
for(i=1;i<=n;i++)
map[0][i]=p[i];
lev[0]=lev[1];
int low=lev[1]-m;
int ans=inf;
for(i=low;i<=lev[1];i++)
{
int tmp=dijkstra(map,n+1,i,m);
if(tmp<ans)
ans=tmp;
}
printf("%d\n",ans);
}
return 0;
}