POJ-1062-昂贵的聘礼

来源:互联网 发布:赵本山女儿淘宝店铺 编辑:程序博客网 时间:2024/05/16 06:26

最开始一直没想到关于等级怎么处理,后来参考了下别人的博客才知道枚举等级差值的方法~受教了!

地址:http://cavenkaka.iteye.com/blog/1189266

代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=110;const int inf=1<<29;int n,m,level[maxn],map[maxn][maxn],dist[maxn];bool vis[maxn];int Dijstra(int st){    for(int i=1;i<=n;i++)dist[i]=map[0][i];    for(int i=0;i<n;i++)    {int mini=inf,pos=-1;for(int j=1;j<=n;j++)    if(!vis[j]&&dist[j]<mini)    {mini=dist[j];pos=j;    }if(pos==-1)    break;vis[pos]=1;for(int j=1;j<=n;j++)    if(!vis[j]&&dist[j]>dist[pos]+map[pos][j])dist[j]=dist[pos]+map[pos][j];    }    return dist[1];}int main(){    while(scanf("%d%d",&m,&n)!=EOF)    {memset(level,0,sizeof(level));memset(map,0x7f,sizeof(map));for(int i=1;i<=n;i++){    int k;    map[i][i]=0;    scanf("%d%d%d",&map[0][i],&level[i],&k);    while(k--)    {int v,c;scanf("%d%d",&v,&c);map[v][i]=c;    }}int ans=inf;for(int i=0;i<=m;i++){    memset(vis,0,sizeof(vis));    for(int j=1;j<=n;j++)if(level[j]<level[1]-i||level[j]>level[1]+m-i)    vis[j]=1;    ans=min(ans,Dijstra(0));}printf("%d\n",ans);    }    return 0;}


原创粉丝点击