1379. Cups Transportation

http://acm.timus.ru/problem.aspx?space=1&num=1379

二分 最短路

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<map>

#include<vector>

#include<stack>

#include<set>

#include<map>

#include<queue>

#include<algorithm>

#include<cmath>

#define LL long long

#define sint short int

//#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const int N=505;

const int T=1440;

const int INF=1000000000;

int head[N],I;

bool had[N];

int dist[N];

int cost[N][N];

int limi[N][N];

int dijkstra(int x1,int x2,int n,int limit)

{

    for(int i=1;i<=n;++i)

    dist[i]=INF;

    memset(had,false,sizeof(had));

    dist[x1]=0;

    for(int w=1;w<=n;++w)

    {

        int k=-1;

        for(int i=1;i<=n;++i)

        if(!had[i]&&(k==-1||dist[i]<dist[k]))

        k=i;

        if(k==x2||dist[k]==INF)

        break;

        had[k]=true;

        for(int i=1;i<=n;++i)

        if(!had[i]&&limi[k][i]>=limit&&dist[k]+cost[k][i]<dist[i])

        dist[i]=dist[k]+cost[k][i];

    }

    return dist[x2];

}

int main()

{

    //freopen("data.in","r",stdin);

    int n,m;

    cin>>n>>m;

    for(int i=1;i<=n;++i)

    for(int j=1;j<=n;++j)

    {limi[i][j]=0;cost[i][j]=INF;}

    int l=1,r=0;

    while(m--)

    {

        int i,j,t,g;

        cin>>i>>j>>t>>g;

        g=max((g-3000000)/100,0);

        cost[i][j]=cost[j][i]=t;

        limi[i][j]=limi[j][i]=g;

        r=max(r,g);

    }

    if(n==1)

    {cout<<"10000000"<<endl;return 0;}

    while(l<=r)

    {

        int mid=(l+r)/2;

        if(dijkstra(1,n,n,mid)<=T)

        l=mid+1;

        else

        r=mid-1;

    }

    cout<<r<<endl;

    return 0;

}

  

你可能感兴趣的:(port)