【Hautoj 1278 Transmit information】+ dfs

本文描述了一个基于抗日战争背景的信息传递问题,通过构建城市交通图模型,利用DFS算法寻找最短路径来完成信息从起点到终点经过指定次数的传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1278: Transmit information
时间限制: 3 秒 内存限制: 128 MB
提交: 24 解决: 13
提交 状态
题目描述
The Chinese people threw themselves into an all-out war of resistance against Japanese aggression in 1937. The first line of resistance against aggression was formed by spies and underground workers.
They lurked in every place of the city.

There’s a piece of information that needs to be passed on to them. Now there is a traffic map, each road connects two different intersections Xi and Yi, each of which is the termination for at least two road. The length of each road is known LENi, no two intersections are directly connected by two different roads.

N spies lurk at every intersection , some intersections mignt have more than one spy. For security, they must position themselves properly , each spy cannot accept information from local intersection , can only be transferred from elsewhere and end up at the finishing pace.

At first, the information is in the hands of a spy at S intersection. After N spies transmission, and finally arrived at E intersection .

Write a program to find the shortest path that connects the starting intersection(S) and the ending intersection(E) ang transmission exactly N spies.
输入
The first line of the input contains one integers T, which is the nember of test cases (1<=T<=5). Each test case specifies:

  • Line 1: Four space-separated integers: N M S E
  • Lines 2..M+1: Line i+1 describes road i with three space-separated integers: LENi Xi Yi

      (  2<=N<=300,000  2<=M<=100,  1<= LENi, Xi, Yi ,S, E <=1000  i=1,…,m) 
    

    输出
    For each test case generate a single line containing a single integer that is the shortest path from intersection S to intersection E that transmits exactly N spies.
    样例输入
    1
    2 6 6 4
    11 4 6
    4 4 8
    8 4 9
    6 6 8
    2 6 9
    3 8 9
    样例输出
    10
    提示

暴力 dfs

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
    int to,vl,next;
}st[210];
int head[1010],vis[1010],n,num,ans;
void add(int a,int b,int vl){
   st[num].vl = vl,st[num].to = b,st[num].next = head[a],head[a] = num++;
}
void dfs(int a,int cut,int en,int sum){
    for(int i = head[a]; i ;i = st[i].next){
        int o = st[i].to;
        if(!vis[o]){
            vis[o] = 1;
            if(cut + 1 == n && en == o) ans = min(ans,sum + st[i].vl);
            else if(cut + 1 < n) dfs(o,cut + 1,en,sum + st[i].vl);
            vis[o] = 0;
        }
    }
}
int main()
{
    int T,m,s,e;
    scanf("%d",&T);
    while(T--){
        num = 0;
        scanf("%d %d %d %d",&n,&m,&s,&e);
        while(m--){
           int vl,a,b; scanf("%d %d %d",&vl,&a,&b);
           add(a,b,vl),add(b,a,vl);
        }
        ans = 0x3f3f3f;
        vis[s] = 1,dfs(s,0,e,0);
        printf("%d\n",ans);
        memset(vis,0,sizeof(vis));
        memset(head,0,sizeof(head));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值