zoukankan      html  css  js  c++  java
  • USACO09FEB 改造路Revamping Trails(分层图模板)

    满分做法:

    因为(k)很小,所以把每个点拆出(k)个点,对应使了多少个高速,这个就是分层图了。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int maxm=3000007;
    int n,m,k;
    int pre[maxm<<1],last[maxm],len[maxm<<1],other[maxm<<1],l;
    ll dis[maxm];
    bool vis[maxm];
    priority_queue<pair<ll,int> >q;
    ll ans;
    void add(int x,int y,int z)
    {
     l++;
     pre[l]=last[x];
     last[x]=l;
     other[l]=y;	
     len[l]=z;
    }
    void dijkstra()
    {
     for(int i=1;i<=(k+1)*n;i++)
     dis[i]=1e14+7;
     dis[1]=0;
     q.push(make_pair(0,1));
     while(q.size())
     {
      int u=q.top().second;
      q.pop();
      if(vis[u]) continue;
      vis[u]=1;
      for(int p=last[u];p;p=pre[p])
      {
       int v=other[p];
       if(dis[v]>dis[u]+len[p])
       {
         dis[v]=dis[u]+len[p];
         q.push(make_pair(-dis[v],v));
       }   
      }
     }	
    }
    int main()
    {
     scanf("%d%d%d",&n,&m,&k);
     for(int i=1;i<=m;i++)
     {
       int x,y,z;
       scanf("%d%d%d",&x,&y,&z);
       add(x,y,z);
       add(y,x,z);
       for(int j=1;j<=k;j++)
       {
       	 add(j*n+x,j*n+y,z);
       	 add(j*n+y,j*n+x,z);
       	 add((j-1)*n+x,j*n+y,0);
       	 add((j-1)*n+y,j*n+x,0);
       }
     }
     dijkstra();
     ans=dis[n];
     for(int j=1;j<=k;j++)
     {
       ans=min(ans,dis[j*n+n]);
     }
     printf("%lld
    ",ans);
     return 0;	
    }
    
  • 相关阅读:
    Java入门——day28
    第四周进度报告
    Java入门——day27
    Java入门——day26
    Java入门——day25
    Java入门——day24
    Ubuntu创建新用户
    SpringBoot默认的Servlet容器是自带的Tomcat,如何定制和修改配置
    哈希
    找到两张相似的图
  • 原文地址:https://www.cnblogs.com/lihan123/p/11832712.html
Copyright © 2011-2022 走看看