题意:问从1到n的最短路,所走的路必须是LOVELOVE,而且是完整的LOVE。就是道最短路的题。
这题比较坑,让人无语。
提供测试数据吧;
2
1 0
1 4
1 1 9 L
1 1 5 O
1 1 2 V
1 1 3 E
答案:
Binbin you disappoint Sangsang again, damn it!
Cute Sangsang, Binbin will come with a donkey after travelling 19 meters and finding 1 LOVE strings at last.
还有,这里的有一组数据超int ,要用long long。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> using namespace std; const int N = 1320; const int M = 13529; const int INF =0x3f3f3f3f; int n,m; long long dis[N][5]; bool visit[N][5]; struct LL { int to,dis,se,nex; } L[M<<1]; int F[N],cnt; void add(int f,int t,int d,int se) { L[cnt].dis = d; L[cnt].se = se; L[cnt].to = t; L[cnt].nex = F[f]; F[f] = cnt++; } void init() { scanf("%d%d",&n,&m); int f,t,d,se; memset(F,0,sizeof(F)); cnt= 1; char tt[3]; for(int i=0; i<m; i++) { scanf("%d%d%d%s",&f,&t,&d,tt); if(tt[0]=='L') se = 0; if(tt[0]=='O') se = 1; if(tt[0]=='V') se = 2; if(tt[0]=='E') se = 3; add(f,t,d,se); add(t,f,d,se); } } struct nod { int v,se,num;long long dis; bool operator<(const nod t) const { if(dis==t.dis) return num<t.num; return dis>t.dis; } }; priority_queue<nod> que; int nums[N][5]; void solve(int c) { while(!que.empty()) que.pop(); for(int i=0;i<=n;i++) { for(int j=0;j<5;j++) dis[i][j] = 0x3f3f3f3f3f3f3f3fll; } memset(visit,false,sizeof(visit)); memset(nums,0,sizeof(nums)); nod e,t; e.v=1,e.dis=0,e.se=0,e.num=0; que.push(e); dis[1][0] = INF; while(!que.empty()) { e = que.top(); que.pop(); if(visit[e.v][e.se]) continue; visit[e.v][e.se] = true; if(e.dis==0) { visit[e.v][e.se] = false; } //dis[e.v][e.se] = e.dis; if(e.v==n&&e.se ==0&&e.dis>0) { cout<<"Case "<<c<<": Cute Sangsang, Binbin will come with a donkey after travelling "<<e.dis<<" meters and finding "<<e.num<<" LOVE strings at last."<<endl; //printf("Case %d: Cute Sangsang, Binbin will come with a donkey after travelling %d meters and finding %d LOVE strings at last.\n",c++,e.dis,e.num); return ; } for(int i=F[e.v]; i; i=L[i].nex) { int to = L[i].to; if(L[i].se!=e.se) continue; int se= (e.se+1)%4; if(se==0) t.num = e.num+1; else t.num = e.num; if(!visit[to][se]&&(dis[to][se]>e.dis+L[i].dis||(nums[to][se]<t.num&&dis[to][se]==e.dis+L[i].dis))) { dis[to][se]=e.dis+L[i].dis; t.dis = dis[to][se]; t.se = se; t.v = to; nums[to][se] = t.num; que.push(t); } } } //printf("Case %d: Binbin you disappoint Sangsang again, damn it!\n",c); cout<<"Case "<<c<<": Binbin you disappoint Sangsang again, damn it!"<<endl; } int main() { freopen("in.txt","r",stdin); int cas,T=1; scanf("%d",&cas); while(cas--) { init(); solve(T++); } return 0; }