Semana de Pensamento e Prática de Programação7 Trabalho de Casa (3/4 / Classe de Dados)

Semana de Pensamento e Prática de Programação7 Trabalho de Casa (3/4 / Classe de Dados)

Gato mágico de A-TT

Como todos sabemos, o TT tem um gato mágico.

Nesse dia, o TT se dedicou a jogar o jogo "Cat and Mouse", mas antes do jogo começar, o gato mágico inteligente contou o resultado final do jogo TT. TT está muito surpreso, não apenas o gatinho está realmente falando, mas também porque essa menina bonitinha é tão mágica?

O Magic Cat diz ao TT que ele realmente tem uma tabela de perdas e ganhos de jogo com N indivíduos e relacionamentos de perda e ganho de M. Cada relacionamento de perda e ganho é AB, indicando que A pode ganhar B e o relacionamento de perda e perda é transitivo. Ou seja, A vence B e B vence C, para que A possa vencer C.

TT não acredita que seu gatinho possa prever qualquer jogo, então ele quer saber quantos resultados de jogadores não podem ser conhecidos antecipadamente. Você pode ajudá-lo?

A

primeira linha de entrada fornece o número de grupos de dados.

A primeira linha de cada conjunto de dados fornece N e M (N, M <= 500).

Nas próximas linhas M, cada linha recebe AB, indicando que A pode vencer B.

Saída

Para cada conjunto de dados, é determinado o quanto o resultado do jogo não pode ser conhecido com antecedência. Observe que (a, b) é equivalente a (b, a), ou seja, cada binário é calculado apenas uma vez.

Sample Input
3
3 3
1 2
1 3
2 3
3 2
1 2
2 3
4 2
1 2
3 4
Sample Output
0
0
4

Análise de problemas

Construa um gráfico direcionado e use o algoritmo de Freud para encontrar o caminho.

dis[i][j]Representa a distância entre dois pontos: se não for um caminho, ele é registrado como um número inteiro máximo uniforme, percorrendo cada ponto no caminho para encontrar o caminho mais curto e depois contando os pontos que não são interoperáveis.

Otimização: o loop triplo convencional atingirá o tempo limite. No loop da segunda camada, julgue se ik tem um caminho. Caso contrário, vá diretamente para o próximo loop da camada.

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int INF = 0x7fffffff;
const int MAXV = 505;
int n,m;
int dis[MAXV][MAXV];
void Floyd(){
	for(int k=1;k<=n;++k){
		for(int i=1;i<=n;++i){
			if(dis[i][k]==INF){
				continue;
			}
			for(int j=1;j<=n;++j){
				if(dis[i][k]!=INF && dis[k][j]!=INF && dis[i][k]+dis[k][j]<dis[i][j]){
					dis[i][j]=dis[i][k]+dis[k][j];
				}
			}
		}
	}
}
int main()
{
	int u,v,w;
	int loop;
	scanf("%d",&loop);
	while(loop--){
		scanf("%d%d",&n,&m);
		fill(dis[0],dis[0]+MAXV*MAXV,INF);
		for(int i=1;i<=n;++i){
			dis[i][i]=0;
		}
		for(int i=1;i<=m;++i){
			scanf("%d%d",&u,&v);
			dis[u][v]=1;
		}
		Floyd();
		int sum=0;
		for(int i=1;i<=n;++i){
			for(int j=1;j<=i;++j){
				if(dis[i][j]==INF&&dis[i][j]==dis[j][i]){
					sum++;
				}
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}

Diário de viagem da B-TT

Como todos sabemos, o TT tem um gato mágico.

Hoje ele abriu uma transmissão ao vivo da viagem na Estação B, gravando suas aventuras com o gato mágico enquanto viajava no gato. TT sai de casa e se prepara para levar o Cat Express ao aeroporto Meow Star. A linha expressa gato gato é dividida em linha econômica e linha comercial, sua velocidade e preço são diferentes. Obviamente, a linha comercial é mais cara que a linha econômica.O TT normalmente só pode pegar a linha econômica, mas hoje o gato mágico da TT mudou para uma passagem de linha comercial e pode pegar uma linha comercial. Supondo que o tempo para a transferência TT seja insignificante, ajude a TT a encontrar a rota mais rápida para o Aeroporto de Miaoxing, caso contrário você perderá o avião!

Entrada A

entrada contém vários conjuntos de dados. A primeira linha de cada conjunto de dados é de 3 números inteiros N, S e E (2 ≤ N ≤ 500, 1 ≤ S, E ≤ 100), que é o número total de estações, ponto inicial e final (ou seja, a estação em que o aeroporto de Meowing está localizado) ) Número.

A próxima linha contém um número inteiro M (1 ≤ M ≤ 1000), que é o número de seções da linha econômica.

Em seguida, existem linhas M, cada linha de 3 números inteiros X, Y, Z (1 ≤ X, Y ≤ N, 1 ≤ Z ≤ 100), o que significa que TT pode pegar a linha econômica de e para a estação X e a estação Y, das quais uma maneira Demora Z minutos.

O número de segmentos de estrada na próxima linha da linha comercial é K (1 ≤ K ≤ 1000).

A próxima linha K é uma descrição do segmento de linha comercial, o formato é o mesmo da linha econômica.

Todas as seções são bidirecionais, mas pode ser necessário usar uma passagem comercial para chegar ao aeroporto. Garanta que a solução ideal seja única.

Saída

Para cada conjunto de dados, imprima 3 linhas. A primeira linha indica as estações (incluindo o ponto inicial e o ponto final) pelas quais o TT passa na ordem de acesso.A segunda linha é o número da estação da transferência TT para a linha comercial (se o bilhete da linha comercial não for usado, emita "Ticket Not Used" sem aspas ), A terceira linha é o tempo total gasto pela TT no aeroporto Meow Star.

Esta pergunta não ignora os espaços e as guias extras, e uma nova linha deve ser impressa entre cada conjunto de respostas

输入样例
4 1 4
4
1 2 2
1 3 3
2 4 4
3 4 5
1
2 4 3
输出样例
1 2 4
2
5

Análise de problemas

Como ele terá apenas 0 ou 1 seção da linha comercial, ele pode atravessar a linha comercial. Suponha que eu selecione o segmento IJ como uma linha comercial em um determinado momento, então os segmentos SI, JE ou SJ, IE assumem a linha econômica ... cada vez que você o grava, pode selecionar o valor mínimo.

Para a parte que toma a linha econômica, o algoritmo Dijkstra pode ser usado duas vezes para registrar as distâncias mais curtas dos pontos inicial e final até outros pontos, respectivamente.

#include <bits/stdc++.h>

using namespace std;
const int size=5e3+10;
const int N=500+5;
const int inf=0x3ffffff;
struct Edge{
	int to,next,w;
}e[size]; 
Edge other[size];
int head[N],tot,n,vis[N],spre[N],sdis[N],tpre[N],tdis[N];
void add(int x,int y,int w)
{
	e[++tot].to=y,e[tot].next=head[x];
	e[tot].w=w;head[x]=tot;
}
priority_queue<pair<int,int> >q;
void dijkstra(int s,int*dis,int*pre)
{
	while(!q.empty())q.pop();
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
		dis[i]=inf,pre[i]=-1;
	dis[s]=0;pre[s]=s;
	q.push(make_pair(0,s));
	while(!q.empty())
	{
		int x=q.top().second;
		q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(int i=head[x];i!=-1;i=e[i].next)
		{
			int y=e[i].to,w=e[i].w;
			if(dis[y]>dis[x]+w)
			{
				dis[y]=dis[x]+w;
				pre[y]=x;
				q.push(make_pair(-dis[y],y));
			}
		}
	}
}
void print(int to,int*pre)
{
	if(pre[to]!=to)
	{
		print(pre[to],pre);
		printf(" %d",to);		
	}
	else
	{
		printf("%d",to);
	}
}
int main() {
	int s,e;
	bool enter=false;
	while(~scanf("%d%d%d",&n,&s,&e))
	{
		if(enter)
			printf("\n");
		enter=true;
		fill(head,head+N,-1);
		tot=-1;
		int m;
		scanf("%d",&m);
		while(m--)
		{
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			add(x,y,z);
			add(y,x,z);
		}
		int k;
		scanf("%d",&k);
		for(int i=0;i<k;i++)
		{
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			other[i].next=x,other[i].to=y,other[i].w=z;
		}
		dijkstra(s,sdis,spre);
		dijkstra(e,tdis,tpre);
		int point=-1,distance=sdis[e];
		bool sort=true;
		for(int i=0;i<k;i++)
		{
			if(sdis[other[i].next]+tdis[other[i].to]+other[i].w<distance)
			{
				distance=sdis[other[i].next]+tdis[other[i].to]+other[i].w;
				point=i;sort=true;
			}
			if(sdis[other[i].to]+tdis[other[i].next]+other[i].w<distance)
			{
				distance=sdis[other[i].to]+tdis[other[i].next]+other[i].w;
				point=i;sort=false;
			}
		}
		if(point==-1)
		{
			print(e,spre);
		}
		else
		{
			if(sort)
			{
				print(other[point].next,spre);
				int temp=other[point].to;
				while(tpre[temp]!=temp)
				{
					printf(" %d",temp);
					temp=tpre[temp];
				}
				printf(" %d",temp);
			}
			else
			{
				print(other[point].to,spre);
				int temp=other[point].next;
				while(tpre[temp]!=temp)
				{
					printf(" %d",temp);
					temp=tpre[temp];
				}
				printf(" %d",temp);
			}
		}
		printf("\n");
		if(point==-1)
			printf("Ticket Not Used\n");
		else
		{
			if(sort)
				printf("%d\n",other[point].next);
			else
				printf("%d\n",other[point].to);
		}
		printf("%d\n",distance);
	}
	return 0;
}

C - o sonho do TT

Esta noite, TT teve um sonho doce!

Em seu sonho, o desejo de TT se tornou realidade, e ele se tornou o líder da Meow Star! Existem N cidades comerciais na estrela Meow, numeradas de 1 a N, das quais Cidade 1 é a cidade onde TT está localizado, ou seja, a capital.

Existem M estradas direcionais no Meow Star para cidades comerciais se comunicarem. No entanto, com a crescente prosperidade dos negócios da Meowstar, algumas estradas ficaram muito cheias. Enquanto TT estava angustiado, seu gatinho mágico encontrou uma solução! A TT tem o prazer de aceitar e promulgar uma nova política para este programa.

A política específica é a seguinte: marque um número inteiro positivo para cada cidade comercial para indicar sua prosperidade.Quando cada gato caminha de uma cidade comercial para outra cidade comercial ao longo da estrada, a TT os cobrará (ponto de partida da prosperidade de destino) Prosperidade) ^ 3 imposto.

TT pretende testar se essa política é razoável, então ele quer saber quanto imposto deve ser pago da capital para outras cidades. Se o valor total for menor que 3 ou não puder ser alcançado, digite "?"

Insira

T na primeira linha, indicando que existem T conjuntos de dados. (1 <= T <= 50)

Para cada conjunto de dados, digite N na primeira linha para indicar o número de pontos. (1 <= N <= 200)

Digite N números inteiros na segunda linha, que representa o peso a [i] de 1 a N pontos. (0 <= a [i] <= 20)

Digite M na terceira linha para indicar o número de estradas direcionadas. (0 <= M <= 100000) Nas

próximas linhas M, cada linha tem dois números inteiros AB, indicando que há uma estrada direcional de A para B.

A seguir, é fornecido um número inteiro Q, indicando o número de consultas. (0 <= Q <= 100000)

Cada consulta fornece um P, o que significa encontrar o imposto mínimo do ponto 1 ao ponto P.

Saída

Cada consulta gera uma linha: se estiver inacessível ou se o imposto for menor que 3, digite '?'.

Sample Input
2
5
6 7 8 9 10
6
1 2
2 3
3 4
1 5
5 4
4 5
2
4
5
10
1 2 4 4 5 6 7 8 9 10
10
1 2
2 3
3 1
1 4
4 5
5 6
6 7
7 8
8 9
9 10
2
3 10
Sample Output
Case 1:
3
4
Case 2:
?
?

Análise de problemas

Verifique se existe uma estrada primeiro e, em seguida, calcule o valor total, se houver uma estrada.

#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3ffffff;
int N,M,T,Q,P;
int dis[205];
int a[100005];  
int cnt[205];
int vis[205];
bool dvis[205];

struct edge{
	int u_,v_,w_;
};
queue< int > q;
vector< edge > G[205];
void addE(int u,int v,int w)
{
	edge e_ ; e_.u_ = u,e_.v_=v,e_.w_=w;
	G[u].push_back(e_);
}

void ini()
{
	for(int i=0;i<=N;i++)
	{
		dis[i] = inf;
		vis[i] = 0;
		cnt[i] = 0;
		dvis[i] = 0;
	}
	while(!q.empty()) q.pop();
	for(int i=0;i<205;i++) G[i].clear();
}

void dfs(int y)
{
	dvis[y] = 1;
	for(int i=0;i<G[y].size();i++)
	{
		y = G[y][i].v_;
		if(dvis[y] == 1)  continue;
		dfs(y);
	}
}

void spfa(int s)
{
	dis[s] = 0;
	vis[s] = 1;
	q.push(s);
	while(!q.empty())
	{
		int x = q.front(); q.pop();
		vis[x] = 0;
		for(int i=0;i<G[x].size();i++)
		{
			int y = G[x][i].v_ , w = G[x][i].w_;
					
			if( dis[y] > dis[x] + w )
			{
				dis[y] =w + dis[x];
				cnt[y] = cnt[x]+1;
				if( cnt[y] >= N)
				{
					dfs(y);
				} 
				if(vis[y]==1 || dvis[y]==1)  continue;		
				
				vis[y] = 1;
				q.push(y);
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin>>T;
	int A,B,cost;
	for(int Ti=1;Ti<=T;Ti++)
	{
		cin>>N;
		ini();
		
		for(int Ai=1;Ai<=N;Ai++)
		{
			cin>>a[Ai];
		}
		cin>>M;
		for(int Gi=0;Gi<M;Gi++)
		{
			cin>>A>>B;
			cost =pow( a[B]-a[A] , 3 ) ;
			addE(A,B,cost);
		}
		spfa(1);
		
		cin>>Q;
		cout<<"Case "<<Ti<<":"<<endl;
		for(int Qi=0;Qi<Q;Qi++)
		{
			cin>>P;
			//输出最少税费 			
				if(dvis[P] || dis[P] == inf || dis[P]<3) 
				{cout<<"?"<<endl;
				continue;}
				
				cout<<dis[P]<<endl;			
		}
	}
	return 0;
}

Acho que você gosta

Origin www.cnblogs.com/master-cn/p/12726207.html
Recomendado
Clasificación