hdu 5385 The path

HDU 5385  

构造题

使用贪心法构造,因为保证有解,点2或n至少有一个直接与点1相连

上述结论可以用反证法证明。

假若2和n不直接与1相连,那么必存在点x直接与1相连,间接与2,n相连。这种情况下无论如何设置边权,都有d[x]<d[2]&&d[x]<d[n],与已知矛盾

那么可以按照每次添加两头的点与1相连,记添加时间为1到该点的最短路,边添加边计算边权

然后不在最短路树上的边权都设为n即可,这样不会使最短路树发生变化

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100008;
struct edge{
    int v,i;
};
int w[maxn];
vector<edge>    g[maxn];
int uni[maxn],dis[maxn];
void solve(int n)
{
    int v,idx,i;
    int left=2,right=n;
    dis[1]=0;int ti=0;
    while(left<right)
    {
        for(i=0;i<g[left].size();i++)
        {
            v=g[left][i].v;
            idx=g[left][i].i;
            if(uni[v]==1)
            {
                dis[left]=ti+1;
                w[idx]=dis[left]-dis[v];
                uni[left++]=1;
                ti++;
                break;
            }
        }
        if(left>=right)    break;
        for(i=0;i<g[right].size();i++)
        {
            v=g[right][i].v;
            idx=g[right][i].i;
            if(uni[v]==1)
            {
                dis[right]=ti+1;
                w[idx]=dis[right]-dis[v];
                uni[right--]=1;
                ti++;
                break;
            }
        }
    }
}
int main()
{
    int i,j,t,n,m,u,v;
    edge pp;
    //freopen("1006.in","r",stdin);
//    freopen("1011.txt","w",stdout);
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
            g[i].clear();
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&u,&v);
            pp.i=i;
            pp.v=u;
            g[v].push_back(pp);
        }
        for(i=1;i<=n;i++)
            uni[i]=i;
        memset(w,-1,sizeof(w));
        solve(n);
        for(i=1;i<=m;i++)
        {
            if(w[i]==-1)
                printf("%d\n",n);
            else
                printf("%d\n",w[i]);
        }
    }
    return 0;
}
时间: 2024-10-07 03:50:34

hdu 5385 The path的相关文章

hdu 5385 The path(最短路+构造)

题目链接:hdu 5385 The path 维护一个l,r,l从2开始递增,r从N开始递减,每个距离值l,r至多走一步,并且每次将可以到达的点标记,注意最后最大值只能有一个. #include <cstdio> #include <cstring> #include <vector> #include <queue> #include <algorithm> using namespace std; typedef pair<int,in

HDU 4889 Scary Path Finding Algorithm

题意: 构造一幅图  使题中给出的程序按该图执行  最终变量doge大于输入的C跳出 思路: 出题人思维简直神了!  实在是膜拜!  借题解的图: 按照图中所画  可以继续向右延伸 为何这样可以??  为何边权要这么取?? 先回答第二个问题: 取负数是为了可以不断的去更新  例如如果走了上面的-4那条边  那么它右边的所有点就又可以再更新一次  这样使更新达到了指数级别 (其实可以把所有的值加上一个值K  不过这个K一定要取好!) 除了负数外我们发现数字都是2的几次幂  如果我们按2进制来考虑的

hdu 5168 Legal path

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5168 题意: 一个有向图,给定起点终点,每条边上有权值. 一条合法的路径定义为相邻边的权值之差不小于K的路径,即路径上每条边的权值至少要比上一条边的权值大K,如果上一条边存在.合法路径的长度定义为路径上的边权值总和. 求从起点到终点的合法路径的最短长度. 限制: 有多组数据,第一行为数据组数T(T≤10). 对于每组数据,第一行为三个整数n,m,K,n,m分别表示这组数据的有向图的点数,边数,起点

HDU 1976 prime path

题意:给你2个数n m,从n变成m最少需要改变多少次. 其中: 1.n  m  都是4位数 2.每次只能改变n的一个位数(个位.十位.百位.千位),且每次改变后后的新数为素数 思路:搜索的变形题,这次我们要搜得方向是改变位数中的一位,然后往下搜,直到求出我们需要的那个解 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> us

hdu 1973 Prime Path

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1973 Prime Path Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices

HDU 1973 Prime path(BFS+素数表)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1973 题目大意:给定两个四位素数a  b,要求把a变换到b变换的过程要保证  每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与前一步得到的素数  只能有一个位不同,而且每步得到的素数都不能重复.求从a到b最少需要的变换次数.无法变换则输出Impossible. 如下面的样例:1033 8179 1033 1733 3733 3739 3779 8779 8179 所以答案为6.

HDU 5385(The path-构造最短路树)

The path Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 724    Accepted Submission(s): 277 Special Judge Problem Description You have a connected directed graph.Let d(x) be the length of the s

HDOJ 5385 The path 构造

The path Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 521    Accepted Submission(s): 190 Special Judge Problem Description You have a connected directed graph.Let d(x) be the length of the s

HDU - 1973 - Prime Path (BFS)

Prime Path Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 987    Accepted Submission(s): 635 Problem Description The ministers of the cabinet were quite upset by the message from the Chief of S