pku 1716(差分约束)

类似于1201,只是这里所有权值均为2,构图的方法参考冯威的论文。

 

#include <iostream> #include <queue> using namespace std; /* 传入源点s,numv存储点的个数,用dis数组存下最短路径值 edge[]为其邻接表 */ class node { public: int v,w; node *next; }; const int inf=-0x7fffffff; const int MAXN=10005; bool visit[MAXN]; int n,pos; int dis[MAXN]; node edge[MAXN],g[MAXN*20]; void add_edge(int u,int v,int w) //建立邻接表 { node *ptr = &g[pos++]; ptr->v=v; ptr->w=w; ptr->next=edge[u].next; edge[u].next=ptr; } void spfa(int s) { node *ptr; int tmp,t; queue<int> que; dis[s] = 0; que.push(s); while(!que.empty()) { tmp = que.front(); que.pop(); visit[tmp] = false; for(ptr = edge[tmp].next;ptr!=NULL;ptr=ptr->next) { t = ptr->w; if(dis[ptr->v] < dis[tmp]+t) { dis[ptr->v] = dis[tmp] + t; if(!visit[ptr->v]) //若该点不在队列中,则入队,并修改相应的信息 { visit[ptr->v] = true; que.push(ptr->v); } } } } } int main() { int i,q,u,v; scanf("%d",&q); pos=0; n=0; for(i=1;i<=MAXN;++i) { visit[i] = false; dis[i] = inf; edge[i].next=NULL; } //init for(i=1;i<=q;++i) { scanf("%d%d",&u,&v); v+=1; if(v>n) n=v; add_edge(u,v,2); } for(i=0;i<=n;++i) { add_edge(i+1,i,-1); add_edge(i,i+1,0); } spfa(0); printf("%d/n",dis[n]); return 0; }

你可能感兴趣的:(pku 1716(差分约束))