寒假第七讲 图论

第一题 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;
}
posted @ 2025-02-19 20:46  ALAN_Lan  阅读(21)  评论(0)    收藏  举报