1085. Meeting 夜

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

简单floy 不过有细节需要注意

首先是常识性的 tram 好像是环行的   还有就是如果有月票他不需要花钱但前提他要去的点有路可走

代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<queue>
#include<stack>
#include <iomanip>
using namespace std;
#define LL long long
const int INF=0x3f3f3f3f;
//priority_queue<int,vector<int>,greater<int> >qt;
const int N=105;
int dist[N][N];
struct people
{
    int money,s,k;
}mem[N];
int main()
{
    //freopen("data.in","r",stdin);
    for(int i=0;i<N;++i)
    for(int j=0;j<N;++j)
    if(i==j)dist[i][j]=0;
    else dist[i][j]=INF;
    int n,m,p;
    cin>>n>>m;
    int road[N];
    while(m--)
    {
        int len;
        cin>>len;
        for(int i=0;i<len;++i)
        {
            cin>>road[i];
            for(int j=0;j<i;++j)
            {
                dist[road[j]][road[i]]=4;
                dist[road[i]][road[j]]=4;
            }
        }
    }
    for(int l=1;l<=n;++l)
    for(int i=1;i<=n;++i)
    for(int j=1;j<=n;++j)
    if(dist[i][j]>dist[i][l]+dist[l][j])
    dist[i][j]=dist[i][l]+dist[l][j];
    /*
    for(int i=1;i<=n;++i)
    for(int j=1;j<=n;++j)
    cout<<i<<"--->"<<j<<": "<<dist[i][j]<<endl;
    */
    cin>>p;
    for(int i=0;i<p;++i)
    cin>>mem[i].money>>mem[i].s>>mem[i].k;
    int MIN=INF;
    int X=0;
    for(int i=1;i<=n;++i)
    {
        int tmp=0;
        for(int j=0;j<p;++j)
        {
            int s=mem[j].s;
            if(mem[j].k==1&&dist[s][i]!=INF)
            continue;
            if(mem[j].money<dist[s][i])
            {tmp=INF;break;}
            //cout<<s<<" "<<i<<endl;
            //cout<<tmp<<" "<<dist[s][i]<<endl;
            tmp+=dist[s][i];
        }//cout<<MIN<<" "<<tmp<<endl;
        if(tmp<MIN)
        {
            MIN=tmp;
            X=i;
        }
    }
    if(MIN==INF)
    cout<<"0"<<endl;
    else
    cout<<X<<" "<<MIN<<endl;

    return 0;
}

  

原文地址:https://www.cnblogs.com/liulangye/p/2795708.html