//#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define endl '\n' #define X first #define Y second #define MAXN 262144 #define MAXV 1048576 #define INF 1000010000 #define LLINF 1000000100000000 #define ULLINF 100000001000000 #define MOD 1000000007 #define control cout<<" passed "<<'\n'; #define ENTER cout< vi; typedef pair pii; typedef vector vll; typedef vector vull; typedef vector vs; void speed() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); } int n; int m; int g; vector hometown; int depth[2048]; vector v[256]; int r[256]; int dist1[2048]; int d[13172]; vector nope[2048]; bool cmphtown(pii a,pii b) { /*if(d[a.Y]=4||dist1[a.Y]==4&&dist1[b.Y]>6)return false; if(dist1[a.Y]<=4||dist1[b.Y]<=4)if(depth[a.Y]>depth[b.Y])return true;*/ if(dist1[a.Y]>dist1[b.Y])return true; if(dist1[a.Y]==dist1[b.Y]) { /*if(r[r[r[a.Y]]]!=0&&r[r[r[b.Y]]]!=0&&nope[a.Y].size()+nope[r[a.Y]].size()+nope[r[r[a.Y]]].size()>=4&&nope[b.Y].size()+nope[r[b.Y]].size()+nope[r[r[b.Y]]].size()>=4) { if(d[r[r[r[a.Y]]]]>d[r[r[r[b.Y]]]])return true; return false; } else if(r[r[a.Y]]!=0&&r[r[b.Y]]!=0&&nope[a.Y].size()>=3&&nope[b.Y].size()>=3&&nope[r[a.Y]].size()>=1&&nope[r[b.Y]].size()>=1) { if(d[r[r[a.Y]]]>d[r[r[b.Y]]])return true; return false; } else if(r[a.Y]!=0&&r[b.Y]!=0&&nope[a.Y].size()>=4&&nope[b.Y].size()>=4) { if(d[r[a.Y]]>d[r[b.Y]])return true; return false; }*/ if(d[a.Y]>d[b.Y])return true; return false; } return false; } int usedfs[2048]; void bfs(int beg) { /*for(int i=1;i<=n;i++) { r[i].push_back(1); }*/ queue q; usedfs[beg]=1; q.push(beg); while(!q.empty()) { auto w=q.front(); q.pop(); for(auto c:v[w]) { if(!usedfs[c.X]) { q.push(c.X); /*for(int i=0;i pq; pii e={0,beg}; pq.push(e); while(!pq.empty()) { e=pq.top(); e.X*=-1;//control; pq.pop(); //if(d[e.X]d[e.Y]+nb.Y) { nb.Y=d[e.Y]+nb.Y; d[nb.X]=nb.Y; auto c=nb; r[c.X]=e.Y; dist1[c.X]=dist1[e.Y]+1; } int nzz=nb.X; int nzzz=nb.Y; nb.Y=nzz; nb.X=nzzz; nb.X*=-1; /*else if(d[nb.v]==max(d[e.v],nb.p)&&d1[nb.v]>d1[e.v]+nb.w) { d1[e.v]=d1[e.v]+nb.w; }*/ pq.push(nb); } } } int cost[2048][2048]; int ab[2048]; void read() { memset(ab,INF,sizeof(ab)); //r[1].push_back(1); cin>>n; cin>>m; cin>>g; for(int i=1;i<=g;i++) { int x; cin>>x; nope[x].push_back(i); hometown.push_back({i,x}); } for(int i=1;i<=n;i++) { for(int j=1;j<=2000;j++) { cin>>cost[i][j]; ab[i]=min(ab[i],cost[i][j]); } } bool us[13072]; memset(us,0,sizeof(us)); for(int i=1;i<=m;i++) { int x,y,c; cin>>x>>y>>c; pii p; p.X=y; p.Y=c; v[x].push_back(p); p.X=x; p.Y=c; v[y].push_back(p); /*if(x==1) { r[y].push_back(x); } else if(y==1) { r[x].push_back(y); } else*/ } bfs(1); dijkstra(1); /*for(auto w:hometown) { cout<> ans; int used[13172]; int moment[2048]; bool comp(vi a,vi b) { if(a[0] a, pair b) { if(a.Y>b.Y)return true; return false; } int minn(int c,int c1,int c2) { int mi=INF; for(int i=1;i<=2000;i++) { ll sum=0; sum+=cost[c][i]; sum+=cost[c1][i]; sum+=cost[c2][i]; if(sum path,int k1,int k2,int time) { int last=1; int sum=cost[k1][time]+cost[k2][time]; int tcost=0; for(auto w:path) { tcost+=sum*min((d[w]-d[last]),1); last=w; if(w==k1) { sum=cost[k2][time]; } } return tcost; } int costtt(vector path,int k1,int k2,int k3,int k4,int time) { int last=1; int sum=cost[k1][time]+cost[k2][time]+cost[k3][time]+cost[k4][time]; int tcost=0; for(auto w:path) { tcost+=sum*max(abs(d[w]-d[last]),1); last=w; if(w==k1) { sum-=cost[k1][time]; } if(w==k2) { sum-=cost[k2][time]; } if(w==k3) { sum-=cost[k3][time]; } if(w==k4) { sum-=cost[k4][time]; } } return tcost; } void solve() { read(); //return; int ha=0; int okk=1; /*for(auto w:hometown) { cout<,int>> vec; for(auto w:hometown) { //if(grad!=w.Y)break; if(fakeused[w.X]==1)continue; vector backt; int brn=2; vector nk; //nk.push_back(w.X); //used[w.X]=1; int ce=w.Y; backt.push_back(w.Y); if(w.Y!=1) { do { backt.push_back(r[ce]); ce=r[ce]; }while(ce!=1); } vector tungtung; //reverse(backt.begin(),backt.end()); if(tes==4)if(backt.size()<2)continue; bool lampar=0; vector usink; vector usink2; ll mee=INF; usink.push_back(w.Y); usink2.push_back(w.X); fakeused[w.X]=1; int lasttown=w.Y; for(int i=0;i=4)break; if(fakeused[brbrrpat]==0) { fakeused[brbrrpat]=1; lam=1; usink2.push_back(brbrrpat); usink.push_back(c); } } if(lam)lasttown=c; if(lam==0) { break; } if(usink.size()>=4)break; } pair,int> pi; pi.X.X=w.X; pi.X.Y=w.Y; pi.Y=d[lasttown]; vec.push_back(pi); continue; ///if(tes==4&&usink.size()<4)continue; ///if(tes==3&&usink.size()<3)continue; ///if(tes==2&&usink.size()<2)continue; int momenta; if(lampar)continue; ll costN=INF; bool lampi=0; int el=0; for(auto c:usink) { ab[c]=INF; for(int i=1;i<=2000;i++) { if(moment[i]==0) { ab[c]=min(cost[c][i],ab[c]); } } } for(int i=1;i<=2000;i++) { if(moment[i]==0) { ll sum=costN-1; if(usink.size()==4){ if(sum=3){ if(sum=2){ if(sum=1){ if(sumel)break; nk.push_back(c); } reverse(backt.begin(),backt.end()); moment[momenta]=1; okk=momenta; vector nik; //cout< backt; int brn=2; vector nk; int ce=w.Y; backt.push_back(w.Y); if(w.Y!=1) { do { backt.push_back(r[ce]); ce=r[ce]; }while(ce!=1); } vector tungtung; //reverse(backt.begin(),backt.end()); //if(tes==4)if(backt.size()<2)continue; bool lampar=0; vector usink; vector usink2; ll mee=INF; usink.push_back(w.Y); usink2.push_back(w.X); for(int i=0;i=4)break; if(used[brbrrpat]==0) { ///used[brbrrpat]=1; lam=1; usink2.push_back(brbrrpat); usink.push_back(c); } } if(lam==0) { break; } if(usink.size()>=4)break; } ///if(tes==4&&usink.size()<4)continue; ///if(tes==3&&usink.size()<3)continue; //if(tes==2&&usink.size()<2)continue; int momenta; //if(lampar)continue; ll costN=INF; bool lampi=0; int el=0; for(auto c:usink) { ab[c]=INF; for(int i=1;i<=2000;i++) { if(moment[i]==0) { ab[c]=min(cost[c][i],ab[c]); } } } for(int i=1;i<=2000;i++) { if(moment[i]==0) { ll sum=costN-1; if(usink.size()==4){ if(sum=3){ if(sum=2){ if(sum=1){ if(sumel)break; nk.push_back(c); } reverse(backt.begin(),backt.end()); moment[momenta]=1; okk=momenta; vector nik; //cout< backt; int pe=w.Y; int brn=2; vector nk; int ce=w.Y; backt.push_back(w.Y); if(w.Y!=1) { do { backt.push_back(r[ce]); ce=r[ce]; }while(ce!=1); } vector tungtung; if(tes==4)if(backt.size()<2)continue; bool lampar=0; vector usink; vector usink2; ll mee=INF; usink.push_back(w.Y); usink2.push_back(w.X); int brg=1; for(int i=0;i=4)break; if(used[brbrrpat]==0) { lam=1; usink2.push_back(brbrrpat); usink.push_back(c); } } if(lam&&c!=w.Y)brg++; if(lam==0) { break; } if(usink.size()>=4)break; } if(tes==4&&usink.size()<4)continue; if(tes==3&&usink.size()<3)continue; if(tes==2&&usink.size()<2)continue; int momenta; if(lampar)continue; ll costN=INF; bool lampi=0; int ele=0; for(auto c:usink) { ab[c]=INF; for(int i=1;i<=2000;i++) { if(moment[i]==0) { ab[c]=min(cost[c][i],ab[c]); } } } for(int i=1;i<=2000;i++) { if(moment[i]==0) { ll sum=costN-1; int be=0; if(brg==2)be=0; else if(brg==3)be=0; if(brg==4)be=0; if(usink.size()==4){ if(sum=3){ if(sum=2){ if(sum=1){ if(sum4000)continue; if(el.X==w.X)continue; if(used[el.X]==1)continue; if(used[w.X]==1)continue; vector backtt; int brnn=2; int cee=w.Y; backtt.push_back(w.Y); if(el.Y!=1) { do { backtt.push_back(r[cee]); cee=r[cee]; }while(cee!=1); } //if(backtt.size()<2)continue; bool lamparr=0; vector usinkk; vector usinkk2; ll meee=INF; usinkk.push_back(el.Y); usinkk2.push_back(el.X); int brgg=1; for(int i=0;i=4)break; if(used[brbrrpat]==0) { lamm=1; usinkk2.push_back(brbrrpat); usinkk.push_back(cc); } } if(lamm&&cc!=el.Y)brgg++; if(lamm==0) { break; } if(usinkk.size()>=4)break; } //if(tes==4&&usinkk.size()<4)continue; //if(tes==3&&usinkk.size()<3)continue; //if(tes==2&&usinkk.size()<2)continue; int momentaa=0; if(lamparr)continue; ll costtN=INF; bool lampii=0; int ele=0; for(auto c:usinkk) { ab[c]=INF; for(int i=1;i<=2000;i++) { if(moment[i]==0) { ab[c]=min(cost[c][i],ab[c]); } } } for(int i=1;i<=2000;i++) { if(moment[i]==0) { ll sum=costN-1; int be=0; if(brgg==2)be=0; else if(brgg==3)be=0; if(brgg==4)be=0; if(usinkk.size()==4){ if(sum=3){ if(sum=2){ if(sum=1){ if(sum=4)break; if(used[brbrrpat]==0) { lam=1; usink2.push_back(brbrrpat); usink.push_back(c); } } if(lam&&c!=w.Y)brg++; if(lam==0) { break; } if(usink.size()>=4)break; } if(tes==4&&usink.size()<4)continue; if(tes==3&&usink.size()<3)continue; if(tes==2&&usink.size()<2)continue; momenta=0; if(lampar)continue; costN=INF; lampi=0; ele=0; for(auto c:usink) { ab[c]=INF; for(int i=1;i<=2000;i++) { if(moment[i]==0) { ab[c]=min(cost[c][i],ab[c]); } } } for(int i=1;i<=2000;i++) { if(moment[i]==0) { ll sum=costN-1; int be=0; if(brg==2)be=0; else if(brg==3)be=0; if(brg==4)be=0; if(usink.size()==4){ if(sum=3){ if(sum=2){ if(sum=1){ if(sumele)break; nk.push_back(c); } reverse(backt.begin(),backt.end()); moment[momenta]=1; okk=momenta; vector nik; //cout< backt; int pe=w.Y; int brn=2; vector nk; int ce=w.Y; backt.push_back(w.Y); if(w.Y!=1) { do { backt.push_back(r[ce]); ce=r[ce]; }while(ce!=1); } vector tungtung; if(tes==4)if(backt.size()<2)continue; bool lampar=0; vector usink; vector usink2; ll mee=INF; usink.push_back(w.Y); usink2.push_back(w.X); int brg=1; for(int i=0;i=4)break; if(used[brbrrpat]==0) { lam=1; usink2.push_back(brbrrpat); usink.push_back(c); } } if(lam&&c!=w.Y)brg++; if(lam==0) { break; } if(usink.size()>=4)break; } if(tes==4&&usink.size()<4)continue; if(tes==3&&usink.size()<3)continue; if(tes==2&&usink.size()<2)continue; int momenta; if(lampar)continue; ll costN=INF; bool lampi=0; int ele=0; for(auto c:usink) { ab[c]=INF; for(int i=1;i<=2000;i++) { if(moment[i]==0) { ab[c]=min(cost[c][i],ab[c]); } } } for(int i=1;i<=2000;i++) { if(moment[i]==0) { ll sum=costN-1; int be=0; if(brg==2)be=0; else if(brg==3)be=0; if(brg==4)be=0; if(usink.size()==4){ if(sum=3){ if(sum=2){ if(sum=1){ if(sumele)break; nk.push_back(c); } reverse(backt.begin(),backt.end()); moment[momenta]=1; okk=momenta; vector nik; //cout<