POJ 3159 good luck to me
2013-10-17 16:39
288 查看
临行前最后一题,居然还不给我1A。
题意,给出一堆B-A<=C,问1和N这两人的最大差值。
直接差分约束求最短路,即最大值即可。
初值将1设为0,那么最大差值就是dis
,AC。
但是这道题居然卡SPFA,太神奇了。
然后要DIJ+HEAP才可以。
看了DISCUSS说,SPFA把队列改成栈就能过,真是神奇。
题意,给出一堆B-A<=C,问1和N这两人的最大差值。
直接差分约束求最短路,即最大值即可。
初值将1设为0,那么最大差值就是dis
,AC。
但是这道题居然卡SPFA,太神奇了。
然后要DIJ+HEAP才可以。
看了DISCUSS说,SPFA把队列改成栈就能过,真是神奇。
#include <set> #include <map> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <string> #include <vector> #include <iomanip> #include <cstring> #include <iostream> #include <algorithm> #define Max 2505 #define FI first #define SE second #define ll long long #define PI acos(-1.0) #define inf 0x3fffffff #define LL(x) ( x << 1 ) #define bug puts("here") #define PII pair<int,int> #define RR(x) ( x << 1 | 1 ) #define mp(a,b) make_pair(a,b) #define mem(a,b) memset(a,b,sizeof(a)) #define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i ) using namespace std; #define M 999999 #define N 111111 int n , m ; struct kdq { int e , l , next ; } ed[M] ; int head , num ; void init() { mem(head ,-1) ; num = 0 ; } void add(int s ,int e ,int l) { ed[num].e = e ; ed[num].l = l ; ed[num].next = head[s] ; head[s] = num ++ ; } int dis , cnt ; bool vis ; queue<int>qe ; int spfa() { while(!qe.empty())qe.pop() ; for (int i = 0 ; i <= n ; i ++ )dis[i] = inf ,cnt[i] = 0 ; dis[1] = 0 ; mem(vis ,0) ; qe.push(1) ; vis[1] = 1 ; while(!qe.empty()) { int tp = qe.front() ; qe.pop() ; vis[tp] = 0 ; if(cnt[tp] > n)return -1 ; for (int i = head[tp] ; ~i ; i = ed[i].next ) { int e = ed[i].e ; int l = ed[i].l ; if(dis[e] > dis[tp] + l) { dis[e] = dis[tp] + l ; if(!vis[e]) { vis[e] = 1 ; qe.push(e) ; cnt[e] ++ ; } } } } return dis - dis[1] ; } struct DIJ { int e , l ; DIJ() {} DIJ(int ee , int lx):e(ee) , l(lx) {} bool operator < (const DIJ &fk )const { return l > fk.l ; } } ; //queue<DIJ>q ; int dij() { priority_queue<DIJ>q ; for (int i = 1 ; i <= n ; i ++ )dis[i] = inf ; mem(vis ,0) ; dis[1] = 0 ; q.push((DIJ) { 1 , 0 }) ; while(!q.empty()) { DIJ tp = q.top() ; q.pop() ; if(vis[tp.e])continue ; vis[tp.e] = 1 ; for (int i = head[tp.e] ; ~i ; i = ed[i].next ) { int e = ed[i].e ; int l = ed[i].l ; if(dis[e] > dis[tp.e] + l ) { dis[e] = dis[tp.e] + l ; q.push(DIJ(e , dis[e])) ; } } } return dis ; } int main() { while(cin >> n >> m ) { int a , b , c ; init() ; for (int i = 0 ; i < m ; i ++ ) { scanf("%d%d%d",&a,&b,&c) ; add(a , b , c) ; } printf("%d\n",dij()) ; } return 0 ; }
相关文章推荐
- Good luck to my little brother
- Good luck to myself ^_^
- poj 1046 Color Me Less
- POJ 2762 Going from u to v or from v to u?(强联通,拓扑排序)
- POJ 3159 Candies
- 差分约束 [1](poj 3159)(简单)
- poj&nbsp;2762&nbsp;Going&nbsp;from&nbsp;u&nbsp;to&nbsp;v&nbsp;or&nbsp;fr…
- GetMeUp – How to start GUI application from service, under Windows Vista/7
- Leaning OpenCV:Corner Detection Using cvGoodFeaturesToTrack
- How to give a good talk?
- HD1847 Good Luck in CET-4 Everybody!(巴什博弈)
- POJ 3159 Candies——差分约束
- poj 1095 Trees Made to Order
- poj 1050 To the Max(最大子矩阵之和)
- build.gradle Failed to resolve:me.relex:circleindicator:1.1.5
- poj 2996 Help Me with the Game
- HDU 1847 Good Luck in CET-4 Everybody!(找规律版巴什博奕)
- poj 2039 To and Fro
- 【POJ 1050】To the Max(dp)
- POJ 2039 To and Fro