| 长途旅行 |
| 难度级别: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; }