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