FZU ACM寒假集训 part7

杂谈

集训的最后一期,明天考完就结束啦,这一期图伦相对于动态规划我写的会相对舒服一点点(可能是因为算法课学了一点),一个是树,一个是图的两种算法,再加上一点深搜,我能做出来的部分就大抵如此了,快放假了!放假了!放假了!放假了!放假了!(发电)

Easy

Stockbroker Grapevine

这题我是先用佛洛伊德算法对每一个位置都进行计算,然后在搜索最长边最短的那个点的位置,就可以得出答案,代码如下

#include <bits/stdc++.h>

using namespace std;

const int MAX_BROKERS=100;
const int INF=INT_MAX;

void floydWarshall(vector<vector<int>> &dist,int n)
{
    for(int k=0;k<n; k++)
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(dist[i][k]!=INF && dist[k][j]!=INF && dist[i][k]+dist[k][j]<dist[i][j])
                    dist[i][j]=dist[i][k]+dist[k][j];
}

int main()
{
    int n;
    while (cin >> n && n != 0)
	{
        vector<vector<int>> dist(MAX_BROKERS,vector<int>(MAX_BROKERS,INF));

        for(int i=0;i<n;i++)
		{
            dist[i][i]=0;
            int numContacts;
            cin>>numContacts;
            for(int j=0;j<numContacts;j++)
			{
                int contact,time;
                cin>>contact>>time;
                dist[i][contact-1]=time;
            }
        }

        floydWarshall(dist,n);

        int minTime=INF;
        int bestBroker=-1;

        for(int i=0;i<n;i++)
		{
            int maxTime=0;
            bool allReachable=1;
            for(int j=0;j<n;j++)
			{
                if(dist[i][j]==INF)
				{
                    allReachable=false;
                    break;
                }
                if(dist[i][j]>maxTime)
                    maxTime=dist[i][j];
            }
            if(allReachable && max
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值