HDU4360(spfa)

本文详细介绍了如何解决HDU在线评测平台上的4360题目的算法思路和代码实现,涉及了图论、SPFA算法、最短路径求解等知识点。

http://acm.hdu.edu.cn/showproblem.php?pid=4360

 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 #include <cstdio>
 5 using namespace std;
 6 const long long inf = 1ll<<57;
 7 const int Ni = 1320*2;
 8 struct node{
 9     int v,w,e;
10     node(){}
11     node(int a,int b,int c) {v=a;w=b;e=c;}
12 };
13 struct qnode{
14     int v,e;
15     qnode(){}
16     qnode(int a,int b) {v=a;e=b;}
17 };
18 vector<node> eg[Ni];
19 long long d[Ni][4];
20 int num[Ni][4];
21 bool vis[Ni][4];
22 int n,m;
23 void spfa(int s)
24 {
25     int i,j;
26     for(i=1;i<=n;i++)
27         for(j=0;j<=3;j++)
28             d[i][j]=inf,num[i][j]=0,vis[i][j]=0;
29     queue<qnode> q;
30     int el=3,er;
31     d[s][el]=0;
32     vis[s][el]=1;
33     q.push(qnode(s,el));
34     while(!q.empty())
35     {
36         qnode qn=q.front(); q.pop();
37         int u=qn.v;
38         el=qn.e;vis[u][el]=0;
39         for(i=0;i<eg[u].size();i++)
40         {
41             node nd=eg[u][i];
42             int v=nd.v,w=nd.w;
43             er=nd.e;
44             if((el+1)%4==er&&(d[u][el]+w<d[v][er]||d[v][er]==0))
45             {
46                 d[v][er]=d[u][el]+w;
47                 num[v][er]=num[u][el];
48                 if(er==3) num[v][er]++;
49                 if(!vis[v][er])
50                 {
51                     q.push(qnode(v,er));
52                     vis[v][er]=1;
53                 }
54             }
55             else if((el+1)%4==er&&(d[u][el]+w==d[v][er]||d[v][er]==0)&&num[u][el]>=num[v][er])
56             {
57                 num[v][er]=num[u][el];
58                 if(er==3) num[v][er]++;
59 
60                 if(!vis[v][er])
61                 {
62                     q.push(qnode(v,er));
63                     vis[v][er]=1;
64                 }
65             }
66         }
67     }
68 }
69 int main()
70 {
71     int t,cs=1;
72     char str[5];
73     int u,v,w;
74     node nd;
75     cin>>t;
76     while(t--)
77     {
78         scanf("%d%d",&n,&m);
79         for(int i=1;i<=n;i++) eg[i].clear();
80         while(m--)
81         {
82             scanf("%d%d%d%s",&u,&v,&w,str);
83             int e;if(str[0]=='L') e=0;
84             else if(str[0]=='O') e=1;
85             else if(str[0]=='V') e=2;
86             else e=3;
87             eg[u].push_back(node(v,w,e));
88             eg[v].push_back(node(u,w,e));
89         }
90         spfa(1);
91         if(d[n][3]!=inf&&d[n][3]!=0)
92         printf("Case %d: Cute Sangsang, Binbin will come with a donkey after travelling %I64d meters and finding %d LOVE strings at last.\n",cs++,d[n][3],num[n][3]);
93         else
94         printf("Case %d: Binbin you disappoint Sangsang again, damn it!\n",cs++);
95     }
96     return 0;
97 }


测试数据:

3
5 5
1 2 1 L
2 3 1 O
3 4 1 V
4 5 2 E
4 5 1 E
1 4
1 1 1 L
1 1 1 O
1 1 1 V
1 1 1 E
9 12
1 3 2 L
3 5 2 O
5 7 2 V
7 9 2 E
1 2 1 L
2 3 1 O
3 4 1 V
4 5 1 E
5 6 1 L
6 7 1 O
7 8 1 V
8 9 1 E
ans:
4 1
4 1
8 2

 

转载于:https://www.cnblogs.com/qijinbiao/archive/2012/08/15/2640719.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值