600-9999
这个为私有贴,专治各种代码乱,所以把代码全塞到这里,其他地方[总录]就不乱了
为了方便转化格式 每个题使用###
并加上标签
853 bellman - ford算法 有边数限制的最短路
$Θ(kmlog(kn))$ —优先队列
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
typedef int ll;
typedef std::pair<ll,ll> pll;
#define MAXN 511
#define MAXM 10011
struct Edge
{
ll v,w,nxt;
}e[MAXM];
ll cnt=0,last[MAXN];
void adde(ll u,ll v,ll w)
{
++cnt;
e[cnt].v=v,e[cnt].w=w;
e[cnt].nxt=last[u];last[u]=cnt;
}
ll n,m,k,dis[MAXN][MAXN];
bool inq[MAXN][MAXN];
std::queue<pll>q;
void bfs(ll s)
{
memset(dis,0x3f,sizeof dis);
dis[s][0]=0;
q.push(pll(s,0));
while(!q.empty())
{
ll u=q.front().first,pk=q.front().second;q.pop();
inq[u][pk]=0;
if(pk>=k)continue;
for(ll i=last[u];i;i=e[i].nxt)
{
ll v=e[i].v;
if(dis[v][pk+1]>dis[u][pk]+e[i].w)
{
dis[v][pk+1]=dis[u][pk]+e[i].w;
if(!inq[v][pk+1])
{
inq[v][pk+1]=1;
q.push(pll(v,pk+1));
}
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(ll i=1;i<=m;++i)
{
ll u,v,w;
scanf("%d%d%d",&u,&v,&w);
adde(u,v,w);
}
bfs(1);
ll ans=0x3f3f3f3f;
for(ll i=0;i<=k;++i)ans=std::min(ans,dis[n][i]);
if(ans==0x3f3f3f3f)puts("impossible");
else printf("%d\n",ans);
return 0;
}
842 DFS 排列数字
#include<iostream>
using namespace std;
const int N = 10;
bool st[N]; //true时表示这个数组已经被用过了
int n, path[N];
// 计算u->n的所经过的路径path
void dfs(int u){
// 边界条件
if (u == n){ //所有位置都填满了 直接输出
for (int i = 0; i < n; i++) printf("%d ", path[i]);
puts("");
return;
}
for(int i = 1; i <= n; i++){
if (!st[i]){ //限定在未用过数组里搜
path[u] = i;
st[i] = true;
dfs(u + 1);
st[i] = false; ////回溯恢复现场 可以再加一个path[u] =0; 不过由于循环内第一行直接覆盖了它的值所以省略
}
}
}
int main(){
scanf("%d", &n);
dfs(0);
return 0;
}