這題做了之後發現自己對差分約束好像終於懂了一點,開始看了roll神的做最長路才a掉
後來自己想了老半天想出來了最短路怎麼寫
最長路版:
#include #include #include #include #include #include #include #include #include #include #include #include #include#includeusing namespace std;
#define inf 0xfffffff
#define maxn 10000
int n;
struct bian
edge[maxn*10];
int head[maxn],dist[maxn],cnt[maxn],tot;
bool vis[maxn];
void add(int u,int v,int w)
bool spfa(int s)
dist[s]=0;
queueq;
q.push(s);
vis[s]=true;
cnt[s]++;
while(!q.empty())}}
}return true;
}int main()
else if(strcmp(str,"faf")==0)
else if(strcmp(str,"saf")==0)
else
}for(int i=1;i<=n;i++)
add(0,i,0);
printf("case %d:\n",kase++);
if(!spfa(0)) printf("impossible\n");
else
}printf("\n");
}return 0;
}
最短路版:
#include #include #include #include #include #include #include #include #include #include #include #include #include#includeusing namespace std;
#define inf 0xfffffff
#define maxn 10000
int n;
struct bian
edge[maxn*10];
int head[maxn],dist[maxn],cnt[maxn],tot;
bool vis[maxn];
void add(int u,int v,int w)
bool spfa(int s)
dist[s]=0;
queueq;
q.push(s);
vis[s]=true;
cnt[s]++;
while(!q.empty())}}
}return true;
}int main()
else if(strcmp(str,"faf")==0)
else if(strcmp(str,"saf")==0)
else
}for(int i=1;i<=n;i++)
add(0,i,-t[i]);
printf("case %d:\n",kase++);
if(!spfa(0)) printf("impossible\n");
else
for(int i=1;i<=n;i++)
}printf("\n");
}return 0;
}
zoj 3668 差分約束
題意 給定l,r a,b 表示序列從l到r的和 a b。並輸出序列最大的取值,誤解輸出 the spacecraft is broken 查分約束 u v 建條邊 則有dis v dis u w u,v 即dis v dis u w u,v sum r 表示0到r的和。則sum r sum l 1 ...
zoj4028(差分約束)
題意 給你以i為結尾的最長上公升子串行的值,和每個值的區間範圍求可行的a i 題解 差分約束,首先滿足l i a i r i 可以建乙個虛擬節點n 1,那麼有a n 1 a i l i a i a n 1 r i 同時當 f i f j i include include include inclu...
zoj 3668 差分約束
約束條件 f i 表示前i塊石頭的能量總和。f r f l 1 a f r f l 1 b f i f i 1 10000 f i f i 1 10000 關於為什麼是字典序。在網上看到如下 總結了一下,差分約束系統有兩個解決方案 1,最短路模型。所有的約束條件都是形如f x f y b,b正負不分...