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;
}