Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- int main(){
- int t;
- cin>>t;
- for(int a=1;a<=t;a++){
- int n,m;
- vector<pair<int,int> >out[1001];
- vector<int>in[1001];
- cin>>n>>m;
- int x,y,t;
- vector<int>v;
- for(int i=0;i<m;i++){
- cin>>x>>y>>t;
- out[x+1].push_back(make_pair(y+1,t));
- in[y+1].push_back(x+1);
- }
- for(int i=0;i<n;i++){
- out[0].push_back(make_pair(i+1,0));
- in[i+1].push_back(0);
- }
- int dist[1001];
- for(int i=1;i<=n;i++)dist[i] = INT_MAX;
- dist[0]=0;
- bool f =false;
- for(int i=0;i<n;i++){
- bool flag = false;
- for(int j=0;j<=n;j++){
- for(int k=0;k<out[j].size();k++){
- if(dist[out[j][k].first]>dist[j]+out[j][k].second){
- flag = true;
- dist[out[j][k].first] = dist[j]+out[j][k].second;
- }
- }
- }
- if(!flag){
- cout<<"Case "<<a<<": impossible"<<endl;
- f =true;
- break;
- }
- }
- if(f)continue;
- int source =-1;
- for(int j=0;j<=n;j++){
- for(int k=0;k<out[j].size();k++){
- int u = out[j][k].first;
- int weight = out[j][k].second;
- // cout<<u<<" "<<dist[u]<<" "<<j<<" "<<dist[j]+weight<<endl;
- if(dist[u]>dist[j]+weight){
- source = u;
- break;
- }
- }
- if(source!=-1)break;
- }
- if(source==-1){
- cout<<"Case "<<a<<": impossible"<<endl;
- continue;
- }
- bool visited[1001];
- for(int i=0;i<=n;i++)visited[i] = false;
- queue<int>q;
- q.push(source);
- while(!q.empty()){
- int u = q.front();
- visited[u] = true;
- q.pop();
- v.push_back(u);
- for(int i=0;i<in[u].size();i++){
- if(!visited[in[u][i]] && in[u][i]!=0){
- q.push(in[u][i]);
- }
- }
- }
- sort(v.begin(),v.end());
- cout<<"Case "<<a<<": ";
- for(int i=0;i<v.size();i++){
- if(i==0)cout<<v[i]-1;
- else cout<<" "<<v[i]-1;
- }
- cout<<endl;
- }
- }
Add Comment
Please, Sign In to add comment