算法竞赛入门经典(第2版)-刘汝佳-第十一章例题解题源码(C++语言)(部分)

例题11-2

本题目直接套用Kruskal算法中,使用并查集来判断来判断联通量,另外要注意的是本题目中顶点的编号是从1开始的,所以初始化p的时候要小心。

#include
using namespace std;
const int maxm=5000;
const int INF=0x3f3f3f3f;
int u[maxm],v[maxm],w[maxm],r[maxm],p[maxm];
int m,n;
   
int cmp(const int i,const int j){return w[i]>n>>m&&n)
	{
		for(int i=0;i>u[i]>>v[i]>>w[i];
		cout<

例题11-4(WA)

本题目直接采用floyd算法求传递闭包就可,只是本题目的输出顺序可能有所要求,导致WA。具体原因还没找到。

#include
using namespace std;
const int maxn = 25+2;
int m,n,d[maxn][maxn];
map n2id;
map id2n;
void solve()
{
	for(int k=0;k>n>>m&&n)
	{	
		cout<<"Calling circles for data set "<>s1>>s2;
			if(!n2id.count(s1))
			{
				n2id[s1]=id;
				id2n[id]=s1;
				id++;
			}
			if(!n2id.count(s2))
			{
				n2id[s2]=id;
				id2n[id]=s2;
				id++;
			}
			d[n2id[s1]][n2id[s2]]=1;	
		}
		solve();
		if(m){
		for (int i=0;i

例题11-5

本题采用的算法思想也是floyd算法,具体代码如下:

#include
using namespace std;
const int maxn = 100+10;
int m,n,d[maxn][maxn];
void solve()
{
	for(int k=1;k<=n;k++)  
		for(int i=1;i<=n;i++)  
       	 	for(int j=1;j<=n;j++)
				if(d[i][k]!=-1&&d[k][j]!=-1)
				{
					if(d[i][j]==-1)
					{
						d[i][j]=max(d[i][k],d[k][j]);
					}
					else
						d[i][j]=min(d[i][j],max(d[i][k],d[k][j]));  
				}   
            
}
int main()
{
	//freopen("datain.txt","r",stdin);
	//freopen("dataout.txt","w",stdout);	
	int Q,rnd=1;
	while(cin>>n>>m>>Q&&n)
	{	
		if(rnd>1) cout<>u>>v>>w;
			d[u][v]=w;
			d[v][u]=w;
		}	
		solve();
		for(int i=0;i>u1>>v1;
			if(d[u1][v1]!=-1)
			cout<




你可能感兴趣的:(算法竞赛)