寒假第七讲 图论
第一题 Stockbroker Grapevine
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=110;
int n;
int d[N][N];
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
}
int main(){
while(scanf("%d",&n)&&n){
memset(d,0x3f,sizeof d);
for(int i=1;i<=n;i++){
int k;
scanf("%d",&k);
while(k--){
int a,b;
scanf("%d%d",&a,&b);
d[i][a]=b;
}
}
floyd();
int res=INF,resi=0;
for(int i=1;i<=n;i++){
int singletime=0;
for(int j=1;j<=n;j++){
if(i==j)
continue;
singletime=max(singletime,d[i][j]);
}
if(res>singletime){
res=singletime;
resi=i;
}
}
if(res==INF)
printf("disjoint\n");
else
printf("%d %d\n",resi,res);
}
return 0;
}
第二题 树的直径
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
vector<int> g[maxn];
int dis[maxn];
int ans = 0;
void dp( int u, int fa )
{
for( auto& v : g[u] )
{
if( v == fa ) continue;
dp( v, u );
ans = max( ans, dis[u] + dis[v] + 1 );
dis[u] = max( dis[u], dis[v] + 1 );
}
}
int main()
{
int n;
cin >> n;
memset( dis, 0, sizeof(int) * ( n + 1 ) );
for( int i = 1; i < n; i++ )
{
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dp( 1, 0 );
cout << ans << endl;
return 0;
}
第三题 Invitation Cards
点击查看代码
#include <iostream>
#include <cstring>
#include <vector>
#include <climits>
#include <queue>
#include <algorithm>
#include <functional>
#define ll long long
using namespace std;
const int maxn = 1e6+7;
const ll INF = 0x3f3f3f3f3f3f3f3f;
vector<pair<int,int> > mp[maxn];
vector<pair<int,int> > remp[maxn];
ll dist_first[maxn], dist_second[maxn];
int P,Q,T;
ll ans;
void dijkstra( int start, int n, long long dist[], vector<pair<int,int> > mp[] )
{
priority_queue< pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > pq;
memset( dist, INF, sizeof( ll ) * ( P + 1 ) ) ;
dist[start] = 0;
pq.push( { start, 0 } );
while( !pq.empty() )
{
int cur = pq.top().first;
long long cur_dist = pq.top().second;
pq.pop();
if( cur_dist > dist[cur] ) continue;
for( auto& edge : mp[cur] )
{
int to = edge.first;
ll weight = edge.second;
if( dist[cur] + weight < dist[to] )
{
dist[to] = dist[cur] + weight;
pq.push( { to, dist[to] } );
}
}
}
}
int main()
{
cin >> T;
while( T-- )
{
cin >> P >> Q;
for( int i = 1; i <= P; i++ )
{
mp[i].clear();
remp[i].clear();
}
while( Q-- )
{
int u, v;
ll w;
cin >> u >> v >> w;
mp[u].push_back( { v, w } );
remp[v].push_back( { u, w } );
}
dijkstra( 1, P, dist_first, mp );
dijkstra( 1, P, dist_second, remp );
ll total_cost = 0;
for( int i = 2; i <= P; i++ )
{
total_cost += dist_first[i] + dist_second[i];
}
cout << total_cost << "\n";
}
return 0;
}
第四题 战略游戏
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1510;
vector<int> g[maxn];
int ans[maxn][2];
void dp( int x, int fa )
{
ans[x][1] = 1;
ans[x][0] = 0;
for( auto& y : g[x] )
{
if( y == fa ) continue;
dp( y, x );
ans[x][1] += min( ans[y][0], ans[y][1] );
ans[x][0] += ans[y][1];
}
}
int main()
{
int n;
cin >> n;
for( int i = 0; i < n; i++ )
{
int u, v, t;
cin >> u >> t;
while( t-- )
{
cin >> v;
g[u].push_back( v );
g[v].push_back( u );
}
}
dp( 0, -1 );
cout << min( ans[0][1], ans[0][0] ) << endl;
return 0;
}

浙公网安备 33010602011771号