Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <list>
- #include <map>
- #include <set>
- #include <deque>
- #include <stack>
- #include <queue>
- #include <algorithm>
- #include <sstream>
- #include <iostream>
- #include <iomanip>
- #include <cstdio>
- #include <cmath>
- #include <cstdlib>
- #include <memory.h>
- #include <ctime>
- #include <bitset>
- using namespace std;
- #define ABS(a) ((a>0)?a:-(a))
- #define MIN(a,b) ((a<b)?(a):(b))
- #define MAX(a,b) ((a<b)?(b):(a))
- #define FOR(i,a,n) for (int i=(a);i<(n);++i)
- #define FI(i,n) for (int i=0; i<(n); ++i)
- #define pnt pair <int, int>
- #define mp make_pair
- #define PI 3.14159265358979
- #define MEMS(a,b) memset(a,b,sizeof(a))
- #define LL long long
- #define U unsigned
- int a[10][310][310];
- int pref[10][310][310];
- int suf[310][310];
- int now[310][310];
- int tmpsuf[310][310];
- int n,m;
- int main()
- {
- #ifdef Fcdkbear
- freopen("in.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- double beg=clock();
- #endif
- int B=clock();
- scanf("%d%d",&n,&m);
- FOR(i,0,n)
- FOR(j,0,n)
- if (i==j)
- a[0][i][j]=0;
- else
- a[0][i][j]=1000000000;
- FOR(i,0,m)
- {
- int v1,v2,t1,t2;
- scanf("%d%d%d%d",&v1,&v2,&t1,&t2);
- a[0][v1-1][v2-1]=t1-t2;
- }
- FOR(i,0,n)
- FOR(j,0,n)
- pref[0][i][j]=a[0][i][j];
- FOR(it,1,10)
- {
- FOR(i,0,n)
- FOR(j,0,n)
- if (i!=j)
- a[it][i][j]=1000000000;
- else
- a[it][i][j]=0;
- FOR(i,0,n)
- FOR(j,0,n)
- if (i==j)
- pref[it][i][j]=0;
- else
- pref[it][i][j]=1000000000;
- FOR(k,0,n)
- FOR(i,0,n)
- FOR(j,0,n)
- a[it][i][j]=MIN(a[it][i][j],a[it-1][i][k]+a[it-1][k][j]);
- FOR(k,0,n)
- FOR(i,0,n)
- FOR(j,0,n)
- pref[it][i][j]=MIN(pref[it][i][j],pref[it-1][i][k]+a[it][k][j]);
- }
- int who=-1;
- int res1=0,res2=-1;
- FOR(it,0,10)
- {
- bool f=false;
- int min1=1000000000;
- FOR(i,0,n)
- min1=MIN(min1,pref[it][i][i]);
- if (min1<0)
- {
- res1|=(1<<it);
- res2=-min1;
- who=it;
- break;
- }
- }
- FOR(i,0,n)
- FOR(j,0,n)
- suf[i][j]=a[who][i][j];
- for (int it=who-1; it>=0; --it)
- {
- FOR(i,0,n)
- FOR(j,0,n)
- if (i==j)
- now[i][j]=0;
- else
- now[i][j]=1000000000;
- if (it!=0)
- FOR(k,0,n)
- FOR(i,0,n)
- FOR(j,0,n)
- now[i][j]=MIN(now[i][j],pref[it-1][i][k]+suf[k][j]);
- else
- {
- FOR(i,0,n)
- FOR(j,0,n)
- now[i][j]=suf[i][j];
- }
- int min1=1000000000;
- FOR(i,0,n)
- min1=MIN(min1,now[i][i]);
- if (min1>=0)
- {
- res1|=(1<<it);
- FOR(i,0,n)
- FOR(j,0,n)
- tmpsuf[i][j]=suf[i][j];
- FOR(k,0,n)
- FOR(i,0,n)
- FOR(j,0,n)
- suf[i][j]=MIN(suf[i][j],tmpsuf[i][k]+a[it][k][j]);
- }
- else
- res2=-min1;
- }
- cout<<res1<<" "<<res2<<endl;
- #ifdef Fcdkbear
- double end=clock();
- fprintf(stderr,"*** Total time = %.3lf ***\n",(end-beg)/CLOCKS_PER_SEC);
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement