Uvalive 6302 Star Travel

思路:把所有最短路找出来,然后跑一次就好了。

把所有最短路找出来大概就是,把边反向,然后从e跑最短路。

然后正向从s跑最短路。然后从s开始,每次跟着最短路(字典序最小)走。

判断一条边是不是最短路,也就是dis[u]+d[v]+hehe=D

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<cmath>
#include<queue>
#include<cstring>
#include<set>
#include<stack>
#include<string>
#include<ctime>
#define LL long long
#define u64 unsigned long long
#define maxn 5010
#define MAX 500010
#define INF 0x3f3f3f3f
#define eps 1e-6
using namespace std;

struct node
{
    int next,to ;
    char str[10] ;
}edge[MAX];

int head[maxn],dis[maxn],top,d[maxn] ;
int mat[30][30] ,pos[maxn] ;
bool vi[maxn] ;
vector<int>qe[maxn] ;

void Unit(int x,int y,char *s)
{
    edge[top].to=y;edge[top].next=head[x] ;
    strcpy(edge[top].str,s) ;head[x]=top++;
}
void spfa1(int s,int e,int dis[])
{
    memset(vi,0,sizeof(vi)) ;
    vi[s]=true;
    queue<int>q;
    q.push(s) ;
    dis[s]=0;
    int i,v,u,hehe;
    while(!q.empty())
    {
        u=q.front();q.pop();
        for(i =0 ; i < qe[u].size();i++)
        {
            v=qe[u][i];
            if(mat[pos[u]][pos[v]])hehe=0;
            else hehe=1;
            if(dis[v]>hehe+dis[u])
            {
                dis[v]=hehe+dis[u] ;
                if(!vi[v])
                {
                    vi[v]=true;
                    q.push(v) ;
                }
            }
        }
        vi[u]=false;
    }
}
void spfa(int s,int e,int dis[])
{
    memset(vi,0,sizeof(vi)) ;
    vi[s]=true;
    queue<int>q;
    q.push(s) ;
    dis[s]=0;
    int i,v,u,hehe;

    while(!q.empty())
    {
        u=q.front();q.pop();
        for(i = head[u] ; i != -1;i=edge[i].next)
        {
            v=edge[i].to ;
            if(mat[pos[u]][pos[v]])hehe=0;
            else hehe=1;
            if(dis[v]>hehe+dis[u])
            {
                dis[v]=hehe+dis[u] ;
                if(!vi[v])
                {
                    vi[v]=true;
                    q.push(v) ;
                }
            }
        }
        vi[u]=false;
    }
}
void solve(int s,int e,int D)
{
    int i ,id ,hehe ,v ;
    char str[10] ;
    bool flag=false;
    while(s != e)
    {
        id=-1;
        for(i = head[s] ; i != -1 ; i = edge[i].next)
        {
            v=edge[i].to;
            if(mat[pos[s]][pos[v]])hehe=0;
            else hehe=1;
            if(hehe+dis[s]+d[v]==D)
            {
                if(id==-1)
                {
                    id=v;
                    strcpy(str,edge[i].str) ;
                }
                else if(strcmp(str,edge[i].str) > 1)
                {
                    id=v;
                    strcpy(str,edge[i].str) ;
                }
            }
        }
      //  cout<<s<<" " << id<<endl;
        if(id==-1) return ;
        if(!mat[pos[s]][pos[id]])
        {
            if(flag)printf(" %s",str) ;
            else printf("%s",str) ;
            flag=true;
        }
        s=id;
    }
    puts("");
}
void out(int n,int *dis)
{
    for(int i=0;i<n;i++)cout<<dis[i]<<" " ;puts("");
}
int main()
{
    int i,n,m,j,len;
    int T,k,x;
    char str[32];
    cin >> T ;
    while(T--)
    {
        scanf("%d",&n) ;
        top=0;
        memset(head,-1,sizeof(head)) ;
        for(i=0;i<maxn;i++)qe[i].clear();
        for( i = 1 ; i <= n ;i++)
        {
            scanf("%d%s%d",&k,str,&m) ;
            pos[k]=str[0]-‘A‘;
            while(m--)
            {
                scanf("%s%d",str,&j) ;
                Unit(k,j,str) ;
                qe[j].push_back(k) ;
            }
        }
        scanf("%d",&m) ;
        while(m--)
        {
            scanf("%d%d%s",&i,&j,str) ;
            memset(mat,0,sizeof(mat)) ;
            len=strlen(str) ;
            for( int i = 0 ; i < len ;i++)
                for( int j = 0 ; j < len ;j++ )
                 mat[str[i]-‘A‘][str[j]-‘A‘]=true;
            memset(dis,INF,sizeof(dis)) ;
            memset(d,INF,sizeof(d)) ;
            spfa1(j,i,d) ;
            spfa(i,j,dis) ;
            solve(i,j,dis[j]);
        }
    }
    return 0 ;
}
/*
2
5
0 A 2 T0 1 T2 2
1 A 1 T1 2
2 A 1 T3 3
3 B 1 T4 4
4 B 1 T5 1
1
0 4 A
6
0 A 2 T0 1 T2 2
1 A 1 T1 2
2 A 2 T3 3 T6 5
3 B 1 T4 4
4 B 1 T5 1
5 A 1 T7 4
2
0 4 A
5 3 A
*/

时间: 2024-10-20 15:11:43

Uvalive 6302 Star Travel的相关文章

初步认识Linux

1. 上课前分享 2. 课后整理笔记,做成博客或者文档. 3. 不要迟到. 4. 课程主要内容: *运维基础: 1)操作系统 2)Linux发展  内核 C语言编写 3)安装 虚拟机实现 4)Linux操作基础 脚本 *使用帮助 manls *操作界面(GUI.CLI:TUI文本用户接口) Xmanager:Xshell终端 .SecureCRT *目录和文件.路径.命令 5)※存储管理(写入数据)  服务器 CPU 内存 外部存储设备 6)进程管理 调度 7)网络管理(网络基础知识 3-4周)

Linux学习《解密之前世与今生》

漆黑的夜里,室内的灯光白亮.静静的,理理思绪,想写点什么.享受着思考和兴奋.学习Linux系统有段时间,今天就和大家分享一下我的收获. 在分享之前,提几个问题: 第一:什么是Linux系统,它为什么会出现? 第二:学习Linux系统,到底是学习些什么东西? OK,带着这几个问题,开始我们今天的解密之旅. 最早计算机出现的时候是没有操作系统这么一说法的,后来人们发现,在使用计算机当中,人是最薄弱的一环,每一次为了让计算机运行程序,我们人需要把程序转换成机器可以理解的格式,而那个时候计算机的输入输出

计算机发展史

long long ago 老祖宗的算盘 ...数百年之后.... 1623 1623年,德国科学家契克卡德(Wilhelm Schickard)制造能够进行6位数的加减运算,是为了帮助自己的挚友天文学家开普勒(kepler)做机械运算,但是这个发明很晚世人发现. 1642 法国科学家帕斯卡为了帮助父亲费力的计算税率税款,19岁的帕斯卡研发出一种系列齿轮组成的,外壳用黄铜材料制作,长20英寸宽4英寸高3英寸的厂方盒子计算器,面板上有一列显示数字的小窗口,旋紧发条后才能转动, 用专用的铁笔来拨动转

托业考试常用词汇-交通运输(Transportation)

常用词汇 单词 英文 例句 到达 arrival Flight status, arrival, and departure times are available on the airline website. 登机牌 boarding pass Passengers will be issued a boarding pass at the check-in counter. 机长 captain The captain and flight crew are responsible for

UVALive 4043 Ants

KM   构图求最小权值匹配 保证最小的权值,所连的边一定是可以不相交的. Ants Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Submit]   [Go Back]   [Status] Description Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on

MB Star troubleshot Mercedes VITO can not drive issue

I have a mileage of about 43,000 km of the 2013 Mercedes-Benz VITO commercial vehicle, there is a problem: Start hanging D block, the vehicle can not travel. First, confirm pick Symptom,found hanging D fail to do so the carriage and Guadang abnormal

UVALive 2664 One-way traffic

One-way traffic Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 266464-bit integer IO format: %lld      Java class name: Main In a certain town there are n intersections connected by two- and one-way str

HDU 4885 TIANKENG’s travel 最短路

判断是否共线用map记录下斜率: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include<algorithm> #include<math.h> #include<map> using namespace std; #define N 1022 const int INF = 1<<30-1;

COMP 2019 Assignment 1 – A Star Search

COMP 2019 Assignment 1 – A Star SearchPlease submit your solution via LEARNONLINE. Submission instructions are given at the end of this assignment.This assessment is due on Sunday, 14 April 2019, 11:59 PM.This assessment is worth 20% of the total mar