jzoj3890-长途旅行【同余最短路】
生活随笔
收集整理的這篇文章主要介紹了
jzoj3890-长途旅行【同余最短路】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目鏈接:https://jzoj.net/senior/#main/show/3890
題目大意
nnn個點mmm條邊的圖,詢問是否有111到nnn長度為TTT的路徑。
解題思路
讓WWW等于連接111的最小權值的兩倍,然后用fi,jf_{i,j}fi,j?表示到第iii個點是否有權值%W=j\%W=j%W=j。然后用fi,T%Wf_{i,T\%W}fi,T%W?判斷就好了。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define ll long long using namespace std; const ll N=55; struct edge_node{ll to,next,w; }a[N*4]; ll n,m,k,T,tot,W,ls[N*21000]; queue<int> q,qw; bool v[N][21000]; void addl(ll x,ll y,ll w) {a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w; } void SPFA(){memset(v,0,sizeof(v));q.push(1);qw.push(0);v[1][0]=1;while(!q.empty()){ll x=q.front(),w=qw.front();q.pop();qw.pop();for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to,yw=(w+a[i].w)%W;if(!v[y][yw]){v[y][yw]=1;q.push(y);qw.push(yw);}}} } int main() {scanf("%lld",&T);while(T--){tot=0;W=2147483647;memset(ls,0,sizeof(ls));scanf("%lld%lld%lld",&n,&m,&k);for(ll i=1;i<=m;i++){ll x,y,w;scanf("%lld%lld%lld",&x,&y,&w);x++;y++;addl(x,y,w);addl(y,x,w);}for(ll i=ls[1];i;i=a[i].next)W=min(W,a[i].w*2);SPFA();if(v[n][k%W]) printf("Possible\n");else printf("Impossible\n");} }總結
以上是生活随笔為你收集整理的jzoj3890-长途旅行【同余最短路】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AITO 问界系列车型 OTA:华为 A
- 下一篇: 11.11 今日攻略:魅族 20 Pro