码迷,mamicode.com
首页 > 其他好文 > 详细

11.10模拟

时间:2016-11-11 00:16:43      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:ima   efi   技术   cst   距离   can   src   lld   amp   

 

 

技术分享得了92.5分。辣鸡。懒惰的我不想去掉红字了,凑合着看吧。

 

 

技术分享

 

技术分享

 

 

 

 

 

 

技术分享

 

 题解:考试的时候想用搜索做,写min函数的时候定义成了bool型,技术分享,找了半天错误,咋就是返回1.然后还是可爱的小qg提醒,才知道要处理环。

技术分享
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<ctime>
#define N 10010
#define M 100010
#define ll long long
using namespace std;
int n,m,cnt(0);
ll v[N];
int num[N][2];
ll minn;
bool f[N]={0},vis[N];
struct node
{
    int z;
    int x,y;
    
}a[M];
int min(ll x,ll y)
{
    if (x<y) return x;
    else return y;
}
ll dfs(int ki)
{
    if (clock()>900) 
      {
           printf("%d\n",f[1]);
           fclose(stdin);
           fclose(stdout);
           return 0;
      }
    if (vis[ki]) return v[ki];
    if (!f[ki]) return v[ki];
    for (int i=num[ki][0];i<=num[ki][1];i++)
      {
          vis[ki]=1;
          v[ki]=min(v[ki],dfs(a[i].x)+dfs(a[i].y));     
          vis[ki]=0;
      }  
    f[ki]=1;                
    return v[ki];
}
bool cmp(node c,node d)
{
    if (c.z<d.z) return 1;
    else return 0;
}
int main()
{
    freopen("dwarf.in","r",stdin);
    freopen("dwarf.out","w",stdout);
    
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%lld",&v[i]);
    for (int i=1;i<=m;i++)
      scanf("%d%d%d",&a[i].z,&a[i].x,&a[i].y);
    sort(a+1,a+m+1,cmp);
    for (int i=1,k;i<=m;i++)
      {
           k=a[i].z;
           if (!f[k]) f[k]=1,num[a[i-1].z][1]=i-1,num[k][0]=i;
      }
    num[a[m].z][1]=m;
    minn=dfs(1);
    cout<<minn<<endl;
    
    fclose(stdin);
    fclose(stdout);
    
    return 0;
}
考场上辣鸡的超时搜索(72.5)

 题解:看了正解之后,哦豁,好神奇,还能用spfa求。由于x,y能合成v,所以x—>v,距离是y;y->v,距离是x。然后跑最短路,这个最短距离就是得到物品i的最小代价。输出到1的最短距离即为解。

技术分享
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 100010
#define ll long long
using namespace std;
int n,m,Head(0),tail(0),num(0);
int vi[N],dis[N],head[N]={0},team[N];
bool f[N]={0};
struct node
{
    int v,t,pre;
}e[N*2];
void add(int to,int from,int dis)
{
    e[++num].v=to;
    e[num].t=dis;
    e[num].pre=head[from];
    head[from]=num;
}
void spfa()
{
    for (int i=1;i<=n;i++)
      {
           dis[i]=vi[i];
           team[++tail]=i;
           f[i]=1;
      }
    while (Head<=tail)
      {
           int k=team[++Head];
           f[k]=0;
           for (int i=head[k];i;i=e[i].pre)
             {
                   int v=e[i].v;
                   if (dis[v]>dis[k]+dis[e[i].t])
                     {
                         dis[v]=dis[k]+dis[e[i].t];
                         if (f[v]==0)
                           {
                              f[v]=1;
                         team[++tail]=v;    
                      }
                }
             }
      }
      
}
int main()
{
    freopen("dwarf.in","r",stdin);
    freopen("dwarf.out","w",stdout);
    
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%d",&vi[i]);
    for (int i=1;i<=m;i++)
      {
           int v,x,y;
           scanf("%d%d%d",&v,&x,&y);
           add(v,x,y);
           add(v,y,x);
      }
    spfa();
    printf("%d\n",dis[1]);
    
    fclose(stdin);
    fclose(stdout);
    
    return 0;
}
神奇的spfa

 

技术分享

技术分享

 

11.10模拟

标签:ima   efi   技术   cst   距离   can   src   lld   amp   

原文地址:http://www.cnblogs.com/sjymj/p/6052483.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!