hdu2962 最短路

题目大意:就是给定起始点和结束点以及卡车的重量,问你在保证卡车重量最大的前提下,最短路径是多少,我们可以枚举卡车的重量,在对每个卡车的重量进行dijkstra,算到终点是否存在最短路径。当然枚举也可以用二分进行优化,时间差的还是蛮多的。

             
  2016-08-05 15:23:00 Accepted 2962 9297MS 9500K 2257 B G++  
   2016-08-05 15:34:54 Accepted 2962 1606MS 9496K 2516 B G++  

下面那个是进行过二分优化的。

//二分+dijkstra
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 0x3f3f3f3f
int n,m,ch,h,l,c,r,s,e,ans1,ans2;
bool visited[1005];
int a[1005][1005],height[1005][1005];
int dist[1005];
int hei[1005];
void dijkstra(int he)
{
    memset(visited,false,sizeof(visited));
    memset(dist,0x3f,sizeof(dist));
    visited[s]=true;
    for(int i=1;i<=n;i++)
    {
        hei[i]=height[s][i];
        if(hei[i]<he)
            dist[i]=INF;
        else
            dist[i]=a[s][i];

    }
    for(int i=1;i<=n;i++)
    {
        int MIN=INF,node=-1;
        for(int j=1;j<=n;j++)
        {
            if(!visited[j]&&dist[j]<MIN&&hei[j]>=he)
            {
                MIN=dist[j];
                node=j;
            }
        }

        if(node==-1)
            return;
        visited[node]=true;

        for(int j=1;j<=n;j++)
        {
            if(!visited[j]&&height[node][j]>=he&&dist[j]>dist[node]+a[node][j])
            {
                dist[j]=dist[node]+a[node][j];
                hei[j]=height[node][j];
            }
        }

    }

}
int main()
{
    int sym=0;
    while(true)
    {
        sym++;
        ans1=-1;
        ans2=-1;
        memset(a,0x3f,sizeof(a));
        memset(height,0,sizeof(height));
        scanf("%d%d",&n,&m);
        if(n==0&&m==0)
            break;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d%d",&l,&r,&h,&c);
            a[l][r]=a[r][l]=c;
            if(h==-1)
                height[l][r]=height[r][l]=INF;
            else
                 height[l][r]=height[r][l]=h;
        }
        for(int i=1;i<=n;i++)
        {
            a[i][i]=height[i][i]=0;
        }
        scanf("%d%d%d",&s,&e,&ch);
        int left=1;
        int right=ch;
       int mid=0;
        while(left<=right)
        {
            mid=(left+right)/2;
            dijkstra(mid);
            if(dist[e]!=INF)
            {
                ans1=dist[e];
                ans2=mid;
                left=mid+1;
            }
            else
                right=mid-1;
        }
        if(sym!=1)
            printf("\n");
        printf("Case %d:\n",sym);
        if(ans1==-1&&ans2==-1)
        {
            printf("cannot reach destination\n");
        }
        else
        {
            printf("maximum height = %d\n",ans2);
            printf("length of shortest route = %d\n",ans1);
        }

    }
    return 0;
}




//枚举+dijkstra
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 0x3f3f3f3f
int n,m,ch,h,l,c,r,s,e;
bool visited[1005];
int a[1005][1005],height[1005][1005];
int dist[1005];
int hei[1005];
void dijkstra(int he)
{
    memset(visited,false,sizeof(visited));
    memset(dist,0x3f,sizeof(dist));
    visited[s]=true;
    for(int i=1;i<=n;i++)
    {
        hei[i]=height[s][i];
        if(hei[i]<he)
            dist[i]=INF;
        else
            dist[i]=a[s][i];

    }
    for(int i=1;i<=n;i++)
    {
        int MIN=INF,node=-1;
        for(int j=1;j<=n;j++)
        {
            if(!visited[j]&&dist[j]<MIN&&hei[j]>=he)
            {
                MIN=dist[j];
                node=j;
            }
        }

        if(node==-1)
            return;
        visited[node]=true;

        for(int j=1;j<=n;j++)
        {
            if(!visited[j]&&height[node][j]>=he&&dist[j]>dist[node]+a[node][j])
            {
                dist[j]=dist[node]+a[node][j];
                hei[j]=height[node][j];
            }
        }

    }

}
int main()
{
    int sym=0;
    while(true)
    {
        sym++;
        memset(a,0x3f,sizeof(a));
        memset(height,0,sizeof(height));
        scanf("%d%d",&n,&m);
        if(n==0&&m==0)
            break;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d%d",&l,&r,&h,&c);
            a[l][r]=a[r][l]=c;
            if(h==-1)
                height[l][r]=height[r][l]=INF;
            else
                 height[l][r]=height[r][l]=h;
        }
        for(int i=1;i<=n;i++)
        {
            a[i][i]=height[i][i]=0;
        }
        scanf("%d%d%d",&s,&e,&ch);
        while(ch!=0)
        {

            dijkstra(ch);
            if(dist[e]!=INF)
            {
                break;
            }
            ch--;
        }
        if(sym!=1)
            printf("\n");
        printf("Case %d:\n",sym);
        if(ch==0)
        {
            printf("cannot reach destination\n");
        }
        else
        {
            printf("maximum height = %d\n",ch);
            printf("length of shortest route = %d\n",dist[e]);
        }

    }
    return 0;
}



猜你喜欢

转载自huyifan951124.iteye.com/blog/2315790