• uva 5073 Test Case Tweaking


    http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3074

    之前写过这类型的题目,为什么比赛的时候就脑抽了呢,

    因为要最短的改动达到目的,所以我们可以这样想,利用dis【a】【b】来表示改动了b条边到达a点。那么对于原图中的边其实我们还加了一些边。

    如原图中a与c相连,我们还加了dis【c】【b+1】与即dis【a】【b】的边,这条边的权值为0,只不过这条边必须在有了dis【a】【b】之后才能添加。

    然后遍历dis【n】【i】就可以了。。

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #define maxn 1000
    #define inf ~0U>>1;
    using namespace std;
    int n,m,cost;
    vector<int>node[maxn];
    int map[maxn][maxn];
    int visit[maxn][maxn];
    int dis[maxn][maxn];
    void init()
    {
        int a,b,c;
        memset(map,0,sizeof(map));
        for(int i=0;i<=n;i++)
            node[i].clear();
        for(int i=0;i<m;i++)
        {
            cin>>a>>b>>c;
            node[a].push_back(b);
            map[a][b]=c;
        }
    }
    
    void solve()
    {
        queue<pair<int,int> >q;//要留空格
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++)
                dis[i][j]=inf;
        memset(visit,0,sizeof(visit));
        dis[1][0]=0;
        q.push(make_pair(1,0));
        visit[1][0]=1;
        while(!q.empty())
        {
            int a=q.front().first,b=q.front().second;
            q.pop();//出队
            for(int i=0;i<node[a].size();i++)
            //if(!visit[node[a][i]][b])
            {
                if(dis[node[a][i]][b]>dis[a][b]+map[a][node[a][i]])
                {
                dis[node[a][i]][b]=dis[a][b]+map[a][node[a][i]];//能松弛就松弛
                if(!visit[node[a][i]][b])//只要不在队列中才加入队列中
                {
                visit[node[a][i]][b]=1;
                q.push(make_pair(node[a][i],b));
                }
                }
                if(dis[node[a][i]][b+1]>dis[a][b])
                {
                dis[node[a][i]][b+1]=dis[a][b];
                if(!visit[node[a][i]][b+1])
                {
                visit[node[a][i]][b+1]=1;
                q.push(make_pair(node[a][i],b+1));
                }//队列是push
                }
            }
            visit[a][b]=0;//出队标记
       }
       for(int i=0;i<=n;i++)
       if(dis[n][i]<=cost)
       {cout<<i<<endl;break;}
    }
    int main()
    {
        while(cin>>n>>m>>cost)
        {
            if(!(n+m+cost))break;
            init();
            solve();
        }
        return 0;
    }
  • 相关阅读:
    Pytorch中的torch.nn类
    form表单转化json对象
    js 算法
    vue 中ref 的使用注意事项
    url 地址含参数较多如何拼接
    关于jsonp知识的理解
    ztree 使用心得
    Git查看与修改用户名、邮箱(转载)
    vue2.0 keep-alive 最佳实战(转载)
    使用keep-alive 实现 页面回退不刷新内容
  • 原文地址:https://www.cnblogs.com/cs1003/p/2659218.html
Copyright © 2020-2023  润新知