【USACO09FEB】問題に対する解決策をリメイク

トピックリンク

今日はエンジンルームシミュレーションゲームタイトルは、検索が行われる最初のバースト、バック(ダイクストラを書き込みます私はあまりにも失って期待していませんでした

この鶏肉料理に先立ち、私は動的計画プラスダイクストラを使用しての考えていることを感じるので、階層図を学ぶことがなかったです

我々\(DIS [I] [J ] \) 1番から第一の牧場に示すため\(I \)号牧場アップグレード(\ J)\最初のセットアップの最短時間を費やし道路、\(Xを\)特許牧草第\(I \)号牧草通信、\(道路(I、Xは)\)を表し(I \)\\(X \)がから、経路長である\(I \)(X \ \) いずれかのアップグレードパス、またはアップグレードしないでください、見つけることは難しいことではありません

\(DIS [X] [J] =分(DIS [I] [J] +道路(I、X)、DIS [X] [J])\)

\(DIS [X] [J + 1] =分(DIS [I]、[J]、DIS [X] [J + 1])\)

次は、私とダイクストラ、約\(K \)番目に小さいメモリヒープ\(DIS [I] \) そして決してアップグレードパス列挙k個のパスをアップグレードするため、このコードの一部は以下の通りであります

    for(int j=0; j<=k; j++)  //枚举升级路径的条数
    {
        memset(vis,0,sizeof(vis));
        while(!q[j].empty())
        {
            p=q[j].top();
            q[j].pop();
            if(vis[p.a]==0) //未访问过
            {
                vis[p.a]=1;
                for(int i=0; i<l[p.a].size(); i++)
                    if(vis[l[p.a][i]]==0)
                    {
                        son=l[p.a][i]; //与i相连的节点
                        if(p.sum+l1[p.a][i]<dis[son][j]) //不升级路径
                        {
                            dis[son][j]=p.sum+l1[p.a][i];
                            node txt;
                            txt.a=l[p.a][i],txt.sum=dis[son][j];
                            q[j].push(txt);
                        }
                        if(j!=k&&p.sum<dis[son][j+1]) //升级路径
                        {
                            dis[son][j+1]=p.sum;
                            node txt;
                            txt.a=l[p.a][i],txt.sum=dis[son][j+1];
                            q[j+1].push(txt);
                        }
                    }
            }
        }
    }

他の友人は、すべてのコードが続き、について話すことは何もありません

#include<bits/stdc++.h>
using namespace std;
#define int long long //注意要long long!!! 
struct node
{
    int a,sum;
    bool operator<(const node&aaa)const
    {
        return aaa.sum<sum;
    }
} p;
int n,m,k,dis[10003][23],x,y,w,ans=1e9,vis[10003],son;
vector<int>l[10003],l1[10003]; //vector存图
priority_queue<node>q[23]; //用堆优化dijkstra 
signed main()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d%d",&x,&y,&w);
        l[x].push_back(y),l[y].push_back(x),l1[x].push_back(w),l1[y].push_back(w); //存图
    }
    for(int i=1; i<=n; i++)
        for(int j=0; j<=k; j++)
            dis[i][j]=1e9; //记得赋初值
    dis[1][0]=0,p.a=1,p.sum=0;
    q[0].push(p);
    for(int j=0; j<=k; j++)  //枚举升级路径的条数
    {
        memset(vis,0,sizeof(vis));
        while(!q[j].empty())
        {
            p=q[j].top();
            q[j].pop();
            if(vis[p.a]==0) //未访问过
            {
                vis[p.a]=1;
                for(int i=0; i<l[p.a].size(); i++)
                    if(vis[l[p.a][i]]==0)
                    {
                        son=l[p.a][i]; //与i相连的节点
                        if(p.sum+l1[p.a][i]<dis[son][j]) //不升级路径
                        {
                            dis[son][j]=p.sum+l1[p.a][i];
                            node txt;
                            txt.a=l[p.a][i],txt.sum=dis[son][j];
                            q[j].push(txt);
                        }
                        if(j!=k&&p.sum<dis[son][j+1]) //升级路径
                        {
                            dis[son][j+1]=p.sum;
                            node txt;
                            txt.a=l[p.a][i],txt.sum=dis[son][j+1];
                            q[j+1].push(txt);
                        }
                    }
            }
        }
    }
    cout<<dis[n][min(m,k)];
    return 0;
}

おすすめ

転載: www.cnblogs.com/dzice/p/11921283.html