长途旅行
难度级别:A; 运行时间限制:3000ms; 运行空间限制:262144KB; 代码长度限制:2000000B
试题描述

JY 是一个爱旅游的探险家,也是一名强迫症患者。现在JY 想要在C 国进行一次长途

旅行,C 国拥有n 个城市(编号为0,1,2...,n - 1),城市之间有m 条道路,可能某个城市到自己

有一条道路,也有可能两个城市之间有多条道路,通过每条道路都要花费一些时间。JY 从

0 号城市开始出发,目的地为n – 1 号城市。由于JY 想要好好参观一下C 国,所以JY 想要旅行恰好T 小时。为了让自己的旅行更有意思,JY 决定不在任何一个时刻停留(走一条到城市自己的路并不算停留)。JY 想知道是否能够花恰好T 小时到达n – 1 号城市(每个城市可经过多次)。现在这个问题交给了你。

若可以恰好到达输出“Possible”否则输出“Impossible”。(不含引号)。

输入
第一行一个正整数Case,表示数据组数。
每组数据第一行3 个整数,分别为n, m, T。
接下来m 行,每行3 个整数x, y, z,代表城市x 和城市y 之间有一条耗时为z 的双向边。
输出
对于每组数据输出”Possible”或者”Impossible”.
输入示例
2
3 3 11
0 2 7
0 1 6
1 2 5
2 1 10000
1 0 1
输出示例
Possible
Impossible
其他说明
【样例解释】
第一组:0 -> 1 -> 2 :11
第二组:显然偶数时间都是不可能的。
【数据范围】
30%: T <= 10000
另有30%: n <= 5 , m <= 10.
100%: 2 <= n <= 50 , 1 <= m <= 100 , 1 <= z <= 10000 , 1 <= T <= 10^18 , Case <= 5.

我还不懂哒。。。

hzwer的题解:http://hzwer.com/5006.html(然而我还不知道这个结论为什么是对的)

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*f;
}
typedef long long ll;
const int maxn=55;
const int maxm=210;
const int maxk=20010;
struct HeapNode {
    int x,u,d;
    bool operator < (const HeapNode& ths) const {return d>ths.d;}
};
int done[maxn][maxk],first[maxn],next[maxm],to[maxm],dist[maxm],n,m,mod,e;
ll d[maxn][maxk],T;
void AddEdge(int u,int v,int w) {
    to[++e]=v;dist[e]=w;next[e]=first[u];first[u]=e;
    to[++e]=u;dist[e]=w;next[e]=first[v];first[v]=e;
}
priority_queue<HeapNode> Q;
int dijkstra() {
    rep(i,1,n) rep(j,0,mod) done[i][j]=0,d[i][j]=1ll<<60;
    d[1][0]=0;Q.push((HeapNode){1,0,0});
    while(!Q.empty()) {
        int x=Q.top().x,u=Q.top().u;Q.pop();
        if(done[x][u]) continue;done[x][u]=1;
        ren {
            int u2=(u+dist[i])%mod;
            if(d[x][u]+dist[i]<d[to[i]][u2]) {
                d[to[i]][u2]=d[x][u]+dist[i];
                Q.push((HeapNode){to[i],u2,d[to[i]][u2]});
            }
        }
    }
    return d[n][T%mod]<=T;
}
int main() {
    dwn(Case,read(),1) {
        n=read();m=read();scanf("%lld",&T);mod=e=0;
        memset(first,0,sizeof(first));
        rep(i,1,m) {
            int u=read()+1,v=read()+1,w=read();
            AddEdge(u,v,w);if(u==1||v==1) mod=w<<1;
        }
        if(!mod) puts("Impossible");
        else if(dijkstra()) puts("Possible");
        else puts("Impossible");
    }
    return 0;
}
View Code

相关文章:

  • 2022-01-23
  • 2021-05-15
  • 2021-09-09
  • 2021-04-18
  • 2021-08-04
  • 2021-04-23
  • 2021-10-29
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-04
  • 2021-09-16
相关资源
相似解决方案