您的位置:首页 > 其它

HDU 4360 As long as Binbin loves Sangsang

2014-08-02 18:00 405 查看
这道题,我已经无力吐槽了。。。n竟然能等于1。。就意味着出发点和终点是一样的。。。我靠。。。。哎。。。
//
//  main.cpp
//  HDU 4360 As long as Binbin loves Sangsang
//
//  Created by 郑喆君 on 8/2/14.
//  Copyright (c) 2014 itcast. All rights reserved.
//

#include<cstdio>
#include<cstring>
#include<iostream>
#include<iomanip>
#include<queue>
#include<cmath>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
typedef long long LL;
const int int_max = 0x07777777;
const int int_min = 0x80000000;
const int maxn = 1400;
const int VM=1500;
const int EM=15000;
//const int INF=999999999;
#define INF 1LL << 50
struct Edge{
int from, to, dist,letter;
};
struct Node{
int pos, letter;
};
vector<Edge> es;
vector<int> g[1400];

int n,m,cnt;
int head[VM],vis[VM][4];
long long dis[VM][4];

//struct Edge{
//    int to,nxt,id;
//    int cap;
//}edge[EM<<1];
int getValue(char c){
if(c=='L') return 0;
if(c=='O') return 1;
if(c=='V') return 2;
return 3;
}
void addedge (int from, int to, int dist, int letter){
Edge e = {from, to, dist, letter};
es.push_back(e);
int num = es.size();
g[from].push_back(num-1);
}
//void addedge(int cu,int cv,int cw,int id){
//    edge[cnt].to=cv;
//    edge[cnt].cap=cw;
//    edge[cnt].id=id;
//    edge[cnt].nxt=head[cu];
//    head[cu]=cnt++;
//}

int inq[maxn][4],bushu[maxn][4];
//long long dis[maxn][4];
struct data{
int u;
long long cap;
int stp,id;
data(int _u,long long _cap,int _stp,int _id):u(_u),cap(_cap),stp(_stp),id(_id){}
};
void SPFA(){
queue<data> q;
while(!q.empty())
q.pop();
memset(dis,0x3f,sizeof(dis));
memset(bushu,0,sizeof(bushu));
q.push(data(1,0,0,3));
while(!q.empty()){
data cur=q.front();
q.pop();
int u=cur.u;
int id=(cur.id+1)%4;
long long cap=cur.cap;
int stp=cur.stp;
//for(int i=head[u];i!=-1;i=edge[i].nxt){
for(int i = 0; i < g[u].size(); i++){
int v=es[g[u][i]].to;
if(id==es[g[u][i]].letter){
if(dis[v][id]>cap+es[g[u][i]].dist || (dis[v][id]==cap+es[g[u][i]].dist && bushu[v][id]<stp+1)){
dis[v][id]=cap+es[g[u][i]].dist;
bushu[v][id]=stp+1;
q.push(data(v,dis[v][id],bushu[v][id],id));
}
}
}
}
}
//void SPFA(){
//    queue<data> q;
//    while(!q.empty())
//        q.pop();
//    memset(dis,0x3f,sizeof(dis));
//    memset(vis,0,sizeof(vis));
//    q.push(data(1,0,0,3));
//    while(!q.empty()){
//        data cur=q.front();
//        q.pop();
//        int u=cur.u;
//        int id=(cur.id+1)%4;
//        long long cap=cur.cap;
//        int stp=cur.stp;
//        for(int i=head[u];i!=-1;i=edge[i].nxt){
//            int v=edge[i].to;
//            if(id==edge[i].id){
//                if(dis[v][id]>cap+edge[i].cap || (dis[v][id]==cap+edge[i].cap &
4000
amp;& vis[v][id]<stp+1)){
//                    dis[v][id]=cap+edge[i].cap;
//                    vis[v][id]=stp+1;
//                    q.push(data(v,dis[v][id],vis[v][id],id));
//                }
//            }
//        }
//    }
//}
int main(int argc, const char * argv[])
{
int t;
cin >> t;
int cases = 0;
while(t-- > 0){
scanf("%d %d", &n, &m);
//        cnt=0;
//        memset(head,-1,sizeof(head));
es.clear();
for(int i = 0; i < maxn; i++) {
g[i].clear();
}
for(int i = 0; i < maxn; i++)
for(int j = 0; j < 4; j++) dis[i][j] = INF;
memset(inq, 0, sizeof(inq));
memset(bushu, 0, sizeof(bushu));
for(int i = 0; i < m; i++){
int u,v,l;
char letter;
scanf("%d %d %d %c",&u,&v,&l,&letter);
addedge(u, v, l, getValue(letter));
addedge(v, u, l, getValue(letter));
}
//        Node node = {1,3};
queue<data> q;
//        q.push(node);
//        inq[1][3] = 1;
//        dis[1][3] = 0;
//        bushu[1][3] = 0;
q.push(data(1,0,0,3));
while(!q.empty()){
data cur = q.front();
q.pop();
inq[cur.u][cur.id] = 0;
int nxt = (cur.id+1)%4;
for(int i = 0; i < g[cur.u].size(); i++){
Edge& edge = es[g[cur.u][i]];
if(edge.letter==nxt && (dis[edge.to][edge.letter] > cur.cap + edge.dist || (dis[edge.to][edge.letter]==cur.cap+edge.dist && bushu[edge.to][edge.letter]<cur.stp+1))){
dis[edge.to][edge.letter] = cur.cap + edge.dist;
bushu[edge.to][edge.letter] = cur.stp+1;//bushu[cur.u][cur.id] + 1;
//if(inq[edge.to][edge.letter]==0){
//Node temp = {edge.to, edge.letter};
q.push(data(edge.to,dis[edge.to][edge.letter],bushu[edge.to][edge.letter],edge.letter));
//  inq[edge.to][edge.letter] = 1;
//}
}
}
//            data cur=q.front();
//            q.pop();
//            int u=cur.u;
//            int id=(cur.id+1)%4;
//            long long cap=cur.cap;
//            int stp=cur.stp;
//            //for(int i=head[u];i!=-1;i=edge[i].nxt){
//            for(int i = 0; i < g[u].size(); i++){
//                int v=es[g[u][i]].to;
//                if(id==es[g[u][i]].letter){
//                    if(dis[v][id]>cap+es[g[u][i]].dist || (dis[v][id]==cap+es[g[u][i]].dist && bushu[v][id]<stp+1)){
//                        dis[v][id]=cap+es[g[u][i]].dist;
//                        bushu[v][id]=stp+1;
//                        q.push(data(v,dis[v][id],bushu[v][id],id));
//                    }
//                }
//            }
}
//SPFA();
long long ret_dis = dis
[3];
int ret_bushu = bushu
[3];
if(ret_dis==dis[n+1][0]){
printf("Case %d: Binbin you disappoint Sangsang again, damn it!\n", ++cases);
}else{
printf("Case %d: Cute Sangsang, Binbin will come with a donkey after travelling %lld meters and finding %d LOVE strings at last.\n", ++cases,ret_dis,ret_bushu/4);
}
//        if(dis
[3]==dis[n+1][0])
//            printf("Case %d: Binbin you disappoint Sangsang again, damn it!\n",++cases);
//        else
//            printf("Case %d: Cute Sangsang, Binbin will come with a donkey after travelling %I64d meters and finding %d LOVE strings at last.\n",++cases,dis
[3],vis
[3]/4);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: