*hdu 2437 DFS

来源:互联网 发布:任务网源码 编辑:程序博客网 时间:2024/06/07 21:01

个人感觉是很好的一道题~~

#include <iostream>#include <cstring>#include <cstdio>#define INF 0x3f3f3f3fusing namespace std;const int MAXN=1005;const int MAXM=20005;struct node{    int u,v,w;};node edge[MAXM];int first[MAXN],next[MAXM];int cc,n,m,s,k;inline void add_edge(int u,int v,int w){    edge[cc].u=u;    edge[cc].v=v;    edge[cc].w=w;    next[cc]=first[u];    first[u]=cc;    cc++;}char tag[MAXN];int dis[MAXN][MAXN];int res,z;void dfs(int u,int cur_d){    int i;    if(tag[u]=='P'&&cur_d%k==0&&(cur_d<res||(cur_d==res&&u<z)))    {        res=cur_d;        z=u;        return ;    }    for(i=first[u];i!=-1;i=next[i])    {        int v=edge[i].v;        int d=cur_d+edge[i].w;        if(dis[v][d%k]==-1||dis[v][d%k]>d)        {            dis[v][d%k]=d;            dfs(v,d);        }    }}int main(){    int t;    scanf("%d",&t);    int cas=0;    while(t--)    {        cas++;        scanf("%d%d%d%d",&n,&m,&s,&k);        int i;        getchar();        for(i=1;i<=n;i++)            scanf("%c",&tag[i]);        memset(first,-1,sizeof(first));        memset(next,-1,sizeof(next));        cc=0;        memset(dis,-1,sizeof(dis));        for(i=1;i<=m;i++)        {            int u,v,w;            scanf("%d%d%d",&u,&v,&w);            add_edge(u,v,w);        }        res=INF;        z=0;        dfs(s,0);        printf("Case %d:",cas);        if(res==INF)            printf(" -1 -1\n");        else            printf(" %d %d\n",res,z);    }    return 0;}


原创粉丝点击