版を刷る・まとめます。
29984 ワード
強いアムウェイブラック先輩板http://blog.csdn.net/loi_black/article/details/531616荍t 18
最短短絡:
spfa
注釈版があります
最短短絡:
spfa
// o(ke),k ,k <=2
#include
#include
#include
#include
#define maxn 1000001
#define inf 0x7ffffff
using namespace std;
// nxt next,
int n,m,tot;
int head[maxn],next[maxn],dist[maxn];
bool vis[maxn];
struct node
{
int from,to,w;
}e[maxn];
void add(int from,int to,int w)
{
e[++tot] = (node){from,to,w};
next[tot] = head[from];
head[from] = tot;
/* e[t].from=i;
e[t].to=j;
e[t].w=w;
e[t].next=head[i];
head[i]=++t;
*/
}
// , ( )
void spfa(int s)
{
queue <int> q;
for(int i=1;i<=n;i++) dist[i]=inf;
q.push(s);
vis[s]=true;
dist[s]=0;
while(!q.empty())
{// for u , : ( ) , for zdl
int u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i!=-1;i=next[i])
{// ,e[i].next: ( )
int v=e[i].to;
if(dist[v]>dist[u]+e[i].w)
{
dist[v]=dist[u]+e[i].w;
if(!vis[v])// ( , ,vis ==0??????)
{
q.push(v);
vis[v]=true;
}
}
}
}
}
int main()
{
freopen("spfa.in","r",stdin);
freopen("spfa.out","w",stdout);
int a,b,c,s,e;
//t=0;
memset(head,-1,sizeof(head)); //head add(a,b,c)
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
//add(y,x,z); , , ,
//!!! , ,
}
// s->e (zdl)
scanf("%d%d",&s,&e);
spfa(s);
if(dist[e]==inf) printf("-1
");
else printf("%d",dist[e]);
return 0;
}
/* , Dijkstra , (Dijkstra )
, , ,
。!!! SPFA , ,
, 。!!! ,
, , ,
, , 。
*/
+SLF最適化#include
#include
#include
#include
#include
#define maxn 20000+10
#define inf 10001
using namespace std;
int n,m,tot=0;
int dis[maxn],head[maxn],next[maxn],vis[maxn];
struct node{
int f,t,w;
}e[maxn];
void add(int f,int t,int w)
{
e[++tot]=(node){f,t,w};
next[tot]=head[f];
head[f]=tot;
return;
}
deque <int> q;
void spfa(int x)
{
while(!q.empty()) q.pop_front();
memset(vis,0,sizeof(vis));
memset(dis,inf,sizeof(dis));
q.push_back(x);
vis[x]=1; dis[x]=0;
//q.push_back(0);// ,push 0 v , , exe
while(!q.empty())
{
int u=q.front();
q.pop_front();
vis[u]=0;
for(int i=head[u];i!=-1;i=next[i])
{
int v=e[i].t;
if(dis[v]>dis[u]+e[i].w)
{
dis[v]=dis[u]+e[i].w;
if(vis[v]==0)
{
if(q.empty()) q.push_front(v);
else
{
if(dis[v]>dis[q.front()]) q.push_back(v);
else q.push_front(v);
}
vis[v]=1;
//dis[v] < dis[q.front()] ? q.push_front(v) : q.push_back(v);
}
}
}
}
return;
}
int main()
{
int a,b,c,s,e;
memset(head,-1,sizeof(head));
scanf("%d%d%d%d",&n,&m,&s,&e);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
spfa(s);
printf("%d
",dis[e]);
return 0;
}
spfa判定負環bfs//maxn<=200001 ( ) TLE ---> P3385
#include
#include
#include
#include
#include
#define maxn 200001
using namespace std;
int n,m,t=0,tot=0,num[maxn];
int dis[maxn],first[maxn],nxt[maxn];
bool vis[maxn];
struct node{
int f,t,d;
}e[maxn*2];
deque <int> q;
void add(int f,int t,int d)
{
e[++tot]=(node){f,t,d};
nxt[tot]=first[f];
first[f]=tot;
}
bool spfa(int x)
{
for(int i=1;i<=n;i++) dis[i]=0x3f3f3f;
memset(vis,false,sizeof(vis));
while(!q.empty()) q.pop_front();
q.push_front(x);
vis[x]=true;
dis[x]=0;
while(!q.empty())
{
int u=q.front();
q.pop_front();
vis[u]=false;
for(int i=first[u];i!=-1;i=nxt[i])
{
int v=e[i].t;
if(dis[v]>dis[u]+e[i].d)
{
dis[v]=dis[u]+e[i].d;
if(!vis[v])
{
if(++num[v]>n) return false;
if(q.empty()) q.push_front(v);
else
{
if(dis[v]>dis[q.front()]) q.push_back(v);
else q.push_front(v);
}
}
}
}
}
return true;
}
int main()
{
freopen("fuhuan.in","r",stdin);
freopen("fuhuan.out","w",stdout);
int a,b,w;
scanf("%d",&t);
while(t--)
{
memset(first,-1,sizeof(first));
memset(num,0,sizeof(num));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&w);
if(w < 0) add(a,b,w);
else { add(a,b,w); add(b,a,w); }
}
if(!spfa(1)) printf("YE5
");
else printf("N0
");
}
return 0;
}
dfs// bfs
// , , ,
#include
#include
#include
#include
#define maxn 200001
using namespace std;
int n,m,t,tot,a,b,w;
int dis[maxn],first[maxn],nxt[maxn*2];//nxt[] !!!
bool vis[maxn],flag;
struct node{
int f,t,d;
}e[maxn*2];
inline int read()
{
char ch=getchar();
int x=0,f=1;
while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=x*10+ch-48; ch=getchar(); }
return x*f;
}
void add(int f,int t,int d)
{
e[++tot]=(node){ f,t,d };
nxt[tot]=first[f];
first[f]=tot;
}
void spfa(int u)
{
int v;
vis[u]=true;
for(int i=first[u];i;i=nxt[i])
{
v=e[i].t;
if(dis[v]>dis[u]+e[i].d)
{
dis[v]=dis[u]+e[i].d;
if(vis[v]||flag)
{
flag=true;
break;
}
spfa(v);
}
}
vis[u]=false;
}
int main()
{
freopen("fuhuan.in","r",stdin);
freopen("fuhuan.out","w",stdout);
t=read();
while(t--)
{
flag=false; tot=0;
n=read();m=read();
for(int i=1;i<=n;i++) { dis[i]=0;vis[i]=0;first[i]=0; }
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&w);
add(a,b,w);
if(w>=0) add(b,a,w);
}
for(int i=1;i<=n;i++)
{
spfa(i);
if(flag) break;
}
if(flag)
printf("YE5
");
else
printf("N0
");
}
return 0;
}
// 0, ,
//
// , , ,
dijkstra#include
#include
#define Max 0x3fffffff
int map[1005][1005];
int dis[1005];
void dijkstra(int n)
{
int visit[1001]={0};
int min,i,j,k;
visit[1]=1;
for(i=1;i1;
// ,
//---> , , maxn,
// , ,
// , ,
// “ ”: , , ,
// ,
for(j=1;j<=n;++j)
{
if(!visit[j]&&min>dis[j])
{
min=dis[j];
k=j;
}
}
visit[k]=1;
// :
//
// map[k][j] Max,dis[j] >dis[k]+map[k][j],
for(j=1;j<=n;++j)
{
if(!visit[j]&&dis[j]>dis[k]+map[k][j])
dis[j]=dis[k]+map[k][j];
}
}
printf("%d
",dis[n]);
}
int main()
{
int t,n,i,j,from,to,cost;
while(scanf("%d%d",&t,&n)!=EOF)
{
for(i=1;i<=n;++i)
{
map[i][i]=0;
for(j=1;jmap [i][j]=map[j][i]=Max;
}
for(i=1;i<=t;++i)
{
scanf("%d%d%d",&from,&to,&cost);
if(cost<map[from][to]) //---> , , Max
map[from][to]=map[to][from]=cost;
}
for(i=1;i<=n;++i)
dis[i]=map[1][i];//dis i , ( ), map Max
dijkstra(n);
}
return 0;
}
並べ替えで逆順を求める注釈版があります
#include
#include
#include
#include
#define ll long long
using namespace std;
const ll maxn=100000+10;
ll a[maxn],b[maxn];
ll n,total;
void msort(ll l,ll r)
{
ll mid=l + r >> 1;
if(l// (l=r), ,
{// l=r , , l=r , , --->from baike
msort(l,mid);
msort(mid+1,r); // ,
}
// , :
//3 2 1 4 6 5 3 2 1 4 6 5 , ,3 2 1 4 6 5 3 、2 1 4 、6 5 ,
// 1 , 3 2 、1 4 6 、5
// ,3 2 1 4 6 5 ,
ll i=l,k=l,j=mid+1;//
while(i<=mid&&j<=r)
{
if(a[i]<=a[j]) b[k++]=a[i++];//a ( + while ) b
//( ( ) )
//b ,a[i] , b,i++,a[j] (i+1)
else
{
total+=mid-i+1;//i (i~mid)+i (i ) // , “ ”,
b[k++]=a[j++];//
}
}
while(i<=mid) b[k++]=a[i++]; //j ,i , i , ①
while(j<=r) b[k++]=a[j++]; //i ,j , j , ②
for(ll i=l;i<=r;i++) a[i]=b[i]; // ( ) b a (// )
// ( ---> while ,
// , ( 。)) b a , a
// ,
// ,① ② ( / )
}
int main()
{
scanf("%d",&n);
for(ll i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
msort(1,n);
printf("%lld
",total);
return 0;
}
/*
:why total+=mid-i+1
4 5 1 6 2 3
, :
4 5 1①--->4 5②,1---> 4,5,1 ...
6 2 3③--->6 2,④1---> 6,2,1 ...
, ④--->③--->②--->① , , , 4 5 1 6 2 3
, , , ( ,
, , , “ ”, ) ,
, , , “ ” , ,
> , “ ” , , “ ” ,
total+=mid-i+1 :
, :1 4 5 | 2 3 6, 4 2 , , ,4
, 4 ( 5), 2 , 4 , 2 , total ,
4 (+1) 4 (mid-i(i 4 ,mid )), mid-i+1 , :
total+=mid-i+1
, , , ,total+=mid-i+1
*/
コメントなし:(はい、コメントをなくしました♪(^∇^*)#include
#include
#define maxn 100010
#define ll long long
using namespace std;
ll n,a[maxn],b[maxn],ans=0;
void gbpx(ll l,ll r)
{
ll mid=(l+r)/2;
if(l1,r);
}
ll i=l,j=mid+1,k=l;
while(i<=mid&&j<=r)//"<=" i/j
{
if(a[i]<=a[j])
{
b[k++]=a[i++];
}
else
{
b[k++]=a[j++]; ans+=mid-i+1;
}
}
while(i<=mid) b[k++]=a[i++];//"<=" ( )
while(j<=r) b[k++]=a[j++];
for(int i=l;i<=r;i++) a[i]=b[i];
}
int main()
{
scanf("%lld",&n);
for(ll i=1;i<=n;i++) scanf("%d",&a[i]);
gbpx(1,n);
printf("%lld
",ans);
return 0;
}
// tot a , tot ^3^