hdu 1598  find the most comfortable road

分类上属于最短路,,不过用枚举可以水过,, 但是却没想到怎样用最短路来求。。

把边的长度排序,每枚举一条边,按顺序添加比枚举边小的边到并查集, 判断起点和重点是否联通,如果是的话 ,另枚举更长的边,取最小值就可以了。。

# include<stdio.h>
# include<string.h>
# include<stdlib.h>
# define PI 0xfffffff
struct node{
    int p,q,dis;
}s[1005];
int father[205];
int find(int x)
{
    while(father[x]!=x)
        x=father[x];
    return x;
}
void Union(int x,int y)
{
    int min,ans1,ans2;
    ans1=find(x);
    ans2=find(y);
    min=(ans1,ans2);
    father[x]=father[y]=father[ans1]=father[ans2]=min;
}
int cmp(const void *a, const void *b)
{
    struct node *c=(struct node *)a;
    struct node *d=(struct node *)b;
    return c->dis - d->dis;
}
int main()
{
    int i,j,n,m,min,Q,start,end;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=1;i<=m;i++)
            scanf("%d%d%d",&s[i].p,&s[i].q,&s[i].dis);
        qsort(s+1,m,sizeof(s[1]),cmp);
        scanf("%d",&Q);
        while(Q--)
        {
            scanf("%d%d",&start,&end);
            min=PI;
            for(i=m;i>=1;i--)
            {
                for(j=1;j<=n;j++)
                    father[j]=j;
                j=i;
                while(j>=1)
                {
                    Union(s[j].p,s[j].q);
                    if(find(start)==find(end))
                    {
                        if(min> s[i].dis - s[j].dis) min=s[i].dis - s[j].dis;
                        break;
                    }
                    j--;
                }
            }
            if(min==PI) min=-1;
            printf("%d\n",min);
        }
    }
    return 0;
}

hdu 3730 Chain

贪心可以解决。。

两种贪心的方法,,一种是对数量最多的珍珠进行讨论, 另一种是对A[i]/B[i]中最大的(既是需要插空多的)进行讨论,,

两种都写了,不过由于没用__int64 一直豆WA,,至今仍是不理解,,100000*100000 也才就10^10 ,不会超过int型的。。。

贴一个对数量进行讨论的吧:

# include<stdio.h>
# define N 100005
__int64 sum,A[N],B[N];
int main()
{
    int i,n,index;
    __int64 max;
    while(scanf("%d",&n)!=EOF)
    {
        max=0;
        index=-1;
        sum=0;
        for(i=1;i<=n;i++)
        {
            scanf("%I64d",&A[i]);
            sum+=A[i];
            if(A[i]>max) {max=A[i];index=i;}
        }
        for(i=1;i<=n;i++)
            scanf("%I64d",&B[i]);
        sum-=A[index];
        if(max>(sum+1)*B[index]) sum+=(sum+1)*B[index];
        else sum+=A[index];
        printf("%I64d\n",sum);
    }
    return 0;
}
posted on 2011-05-05 19:50  奋斗青春  阅读(137)  评论(0)    收藏  举报