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); } }
相关文章推荐
- HDU 4360 - As long as Binbin loves Sangsang
- hdu 4360 As long as Binbin loves Sangsang
- HDU-4360 As long as Binbin loves Sangsang
- hdu 4360 As long as Binbin loves Sangsang
- HDU 4360 As long as Binbin loves Sangsang
- HDU 4360 As long as Binbin loves Sangsang
- hdu 4360 As long as Binbin loves Sangsang
- HDU 4360 As long as Binbin loves Sangsang(最短路)
- HDU 4360 As long as Binbin loves Sangsang
- HDU 4360 As long as Binbin loves Sangsang(SPFA)
- [最短路] hdu 4360 As long as Binbin loves Sangsang
- hdu 4360 As long as Binbin loves Sangsang(最短路)
- hdu 4360 As long as Binbin loves Sangsang(最短路拆点,5级)
- HDU-4360-As long as Binbin loves Sangsang
- HDU-4360 As long as Binbin loves Sangsang(Dijkstra)
- As long as Binbin loves Sangsang
- MUTC7 A-As long as Binbin loves Sangsang
- hdu4360 As long as Binbin loves Sangsang(spfa)
- MUTC7 A-As long as Binbin loves Sangsang
- hdu4360(As long as Binbin loves Sangsang)(线段树)