给一个有向图,起点,和一个数k。
每个点可能是T或P,保证起点是T,要求走到P的路径中 路径长度是k的倍数且最短的距离和终点编号。
直接dfs水过
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#define ll long long
#define mod 1000000007
using namespace std;
struct node
{
int v,w,next;
}e[20010];
int n,m,st,k,h,head[1010],vis[1010][1010],dp[1010];
char s[1010];
void init()
{
memset(head,-1,sizeof head);
memset(vis,0,sizeof vis);
memset(dp,0x3f,sizeof dp);
h=0;
}
void addedge(int a,int b,int c)
{
e[h].v=b;
e[h].w=c;
e[h].next=head[a];
head[a]=h++;
}
void dfs(int x,int res)
{
if(s[x-1]=='P'&&res%k==0)
{
dp[x]=min(dp[x],res);
return ;
}
for(int i=head[x];i!=-1;i=e[i].next)
{
int tmp=res+e[i].w;
int to=e[i].v;
if(!vis[to][tmp%k])
{
vis[to][tmp%k]=1;
dfs(to,tmp);
}
}
}
int main()
{
int t,cas=1,i,ans,p,u,v,w;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d%d%d",&n,&m,&st,&k);
scanf("%s",s);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
dfs(st,0);
ans=inf;p=0;
for(int i=1;i<=n;i++)
{
if(dp[i]<ans)
{
ans=dp[i];
p=i;
}
}
printf("Case %d: ",cas++);
if(ans==inf) printf("-1 -1\n");
else printf("%d %d\n",ans,p);
}
return 0;
}
本文介绍了一种解决特定有向图问题的算法:从指定起点出发,寻找到达类型为P节点的路径,要求该路径长度为给定数值k的倍数,并记录下最短路径长度及终点编号。通过深度优先搜索(DFS)实现这一目标。
348

被折叠的 条评论
为什么被折叠?



