ACMクラシックアルゴリズム
<strong>1.n d </strong>
#include<stdio.h>
#include<stdlib.h>
int main(){
int n=3,d=10;
while(1){
scanf("%d%d",&n,&d);
if(n==0&&d==0) break;
long ans=1;
long temp=n;
while(d){
if(d&0x01){
ans*=temp;
}
d>>=1;
temp*=temp;
}
printf("%ld
",ans);
}
return 0;
}
<strong>2. n 2. n </strong>
#include<stdio.h>
#define N 25
int main(){
int T,i,j;
scanf("%d",&T);
long data[N][N];
for(i=1;i<N;i++){data[i][i]=1;data[i][1]=1;}
for(i=2;i<N;i++){
for(j=2;j<i;j++){
data[i][j]=data[i-1][j-1]+j*data[i-1][j];
}
data[i][i]=1;
}
while(T--){
int n;
scanf("%d",&n);
long result=0;
for(i=1;i<=n;i++) result+=data[n][i];
printf("%ld
",result);
}
return 0;
}
<strong>3. quick_mod</strong>
long quick_mod ( long a , long n ,long p ){
long t =a , ret =1;
while( n ){
if( n &1) ret=ret * t-(ret * t/p)*p;
n>>=1; //n , 2
t = t * t -(t * t/p)*p;
}
return ret ;
}
<strong>4. </strong>
#include<stdio.h>
#define Max 1000000007
void extended_gcd( long a, long b, long &x ,long &y){
if(b==0){ x=1; y=0; return;}
extended_gcd(b,a%b,x,y);
long temp=x;
x=y;
y=temp-a/b*y;
}
long inv(long b , long n){
long x=1,y=2;
extended_gcd(b,n,x,y);
x=(x%n+n)%n;
return x;
}
int main(){
int n,i;
while(scanf("%d",&n)!=EOF){
int m=2*n-1;
long a=1,b=1;
for(i=n;i>0;i--){
a=(a*m)%Max;
m--;
}
for(i=n;i>1;i--){
b=(b*i)%Max;
}
long x=inv(b,Max); //(a/b)%p, (b*x)%p=1
long ans=a*x%Max;
printf("%lld
",ans);
}
return 0;
}
<strong>5. </strong>
#include<stdio.h>
int maxSum(int data[100][100],int n,int m){
int max=-127;
int a,c,i,j,start,all;
for(a=0;a<=n;a++)
for(c=a;c<=n;c++){
start=0;
for(i=a;i<=c;i++) start+=data[i][m];
all=start;
for(i=m-1;i>=0;i--){
if(start<0) start=0;
for(j=a;j<=c;j++) start+=data[j][i];
if(start>all) all=start;
if(all>max) max=all;
}
}
return max;
}
int main(){
int n,i,j;
scanf("%d",&n);
int data[100][100];
if(n>1){
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&data[i][j]);
printf("%d
",maxSum(data,n-1,n-1));
}
else if(n==1){
scanf("%d",&j);
printf("%d
",j);
}
else printf("0
");
return 0;
}
<strong>
6. n </strong>
#include<stdio.h>
#include <stdlib.h>
#define Max 1000000007
int main(){
long t=1;
scanf("%ld",&t);
while(t>0){
long i,a=1,b=2,c=3,n=4;
scanf("%ld%ld%ld%ld",&a,&b,&c,&n);
long sum=a;
if(n==2) sum=b;
else if(n==3) sum=c;
else if(n>3){
n=n-3;
long long ans[9]={1,0,0,0,1,0,0,0,1};
long long temp[9]={1,1,1,1,0,0,0,1,0};
long long p[9];
while(n){
if(n&0x01){
p[0]=(ans[0]*temp[0]+ans[1]*temp[3]+ans[2]*temp[6])%Max;
p[1]=(ans[0]*temp[1]+ans[1]*temp[4]+ans[2]*temp[7])%Max;
p[2]=(ans[0]*temp[2]+ans[1]*temp[5]+ans[2]*temp[8])%Max;
p[3]=(ans[3]*temp[0]+ans[4]*temp[3]+ans[5]*temp[6])%Max;
p[4]=(ans[3]*temp[1]+ans[4]*temp[4]+ans[5]*temp[7])%Max;
p[5]=(ans[3]*temp[2]+ans[4]*temp[5]+ans[5]*temp[8])%Max;
p[6]=(ans[6]*temp[0]+ans[7]*temp[3]+ans[8]*temp[6])%Max;
p[7]=(ans[6]*temp[1]+ans[7]*temp[4]+ans[8]*temp[7])%Max;
p[8]=(ans[6]*temp[2]+ans[7]*temp[5]+ans[8]*temp[8])%Max;
for(i=0;i<9;i++) ans[i]=p[i];
}
n>>=1;
p[0]=(temp[0]*temp[0]+temp[1]*temp[3]+temp[2]*temp[6])%Max;
p[1]=(temp[0]*temp[1]+temp[1]*temp[4]+temp[2]*temp[7])%Max;
p[2]=(temp[0]*temp[2]+temp[1]*temp[5]+temp[2]*temp[8])%Max;
p[3]=(temp[3]*temp[0]+temp[4]*temp[3]+temp[5]*temp[6])%Max;
p[4]=(temp[3]*temp[1]+temp[4]*temp[4]+temp[5]*temp[7])%Max;
p[5]=(temp[3]*temp[2]+temp[4]*temp[5]+temp[5]*temp[8])%Max;
p[6]=(temp[6]*temp[0]+temp[7]*temp[3]+temp[8]*temp[6])%Max;
p[7]=(temp[6]*temp[1]+temp[7]*temp[4]+temp[8]*temp[7])%Max;
p[8]=(temp[6]*temp[2]+temp[7]*temp[5]+temp[8]*temp[8])%Max;
for(i=0;i<9;i++) temp[i]=p[i];
}
sum=(((ans[0]*c)%Max)+((ans[1]*b)%Max)+((ans[2]*a)%Max))%Max;
}
printf("%ld
",sum);
t--;
}
return 0;
}
<strong>
7. </strong>
void quick_sort(int x[],int l,int u){
if(l>=u) return;
int t=x[l];
int i=l;
int j=u+1;
int temp;
while(1){
do{i++;}while(i<=u&&x[i]<t);
do{j--;}while(x[j]>t);
if(i>j)break;
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
temp=x[l];
x[l]=x[j];
x[j]=temp;
quick_sort(x,l,j-1);
quick_sort(x,j+1,u);
}
<strong>
8. fibonacci —— </strong>
#include<stdio.h>
#define M 10000
int main(){
long n=4;
int i,j;
while(scanf("%ld",&n)!=EOF){
int data[2][2]={{1,1},{1,0}};
int sum[2][2]={{1,0},{0,1}};
int temp[2][2];
int result=1;
if(n>2){
n-=2;
while(n){
if(n&1){
temp[0][0]=(sum[0][0]*data[0][0]+sum[0][1]*data[1][0])%M;
temp[0][1]=(sum[0][0]*data[0][1]+sum[0][1]*data[1][1])%M;
temp[1][0]=(sum[1][0]*data[0][0]+sum[1][1]*data[1][0])%M;
temp[1][1]=(sum[1][0]*data[0][1]+sum[1][1]*data[1][1])%M;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
sum[i][j]=temp[i][j];
}
n>>=1;
temp[0][0]=(data[0][0]*data[0][0]+data[0][1]*data[1][0])%M;
temp[0][1]=(data[0][0]*data[0][1]+data[0][1]*data[1][1])%M;
temp[1][0]=(data[1][0]*data[0][0]+data[1][1]*data[1][0])%M;
temp[1][1]=(data[1][0]*data[0][1]+data[1][1]*data[1][1])%M;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
data[i][j]=temp[i][j];
}
result=(sum[0][0]+sum[1][0])%M;
}
printf("%d
",result);
}
return 0;
}
<strong>9. gcd</strong>
long gcd(long x,long y){
return (!y)?x:gcd(y,x%y);
}
<strong>10. </strong>
#include<stdio.h>
struct node_1{
int power;
int intelligence;
int agile;
int index;
};
void sort_1(node_1* node,int down,int up){
for(int i=down;i<up;i++)
for(int j=i+1;j<up;j++){
if(node[i].intelligence<node[j].intelligence){
node_1 temp=node[i];
node[i]=node[j];
node[j]=temp;
}
}
}
void sort_2(node_1* node,int down,int up){
for(int i=down;i<up;i++)
for(int j=i+1;j<up;j++){
if(node[i].agile>node[j].agile){
node_1 temp=node[i];
node[i]=node[j];
node[j]=temp;
}
}
}
int main(){
int i,n=4,j;
node_1 node[500];
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d%d%d",&node[i].power,&node[i].intelligence,&node[i].agile);
node[i].index=i+1;
}
for(i=0;i<n;i++)
for(j=i+1;j<n;j++){
if(node[i].power<node[j].power){
node_1 temp=node[i];
node[i]=node[j];
node[j]=temp;
}
}
int start=0;
int end=1;
while(end<n){
while(node[start].power==node[end].power&&end<n){
end++;
}
if(end-start>1) {
sort_1(node,start,end);
}
start=end;
end++;
}
start=0;
end=1;
while(end<n){
while(node[start].intelligence==node[end].intelligence&&node[start].power==node[end].power&&end<n){
end++;
}
if(end-start>1) {
sort_2(node,start,end);
}
start=end;
end++;
}
for(i=0;i<n;i++) printf("%d
",node[i].index);
return 0;
}
<strong>11. ACM </strong>
#include<stdio.h>
int main(){
int T=2;
scanf("%d",&T);
while(T>0){
int n=3;
scanf("%d",&n);
int ret=1;
int result=0;
while(n){
int temp=n&0x03;
n=n/4;
if(n&0x01){
switch(temp){
case 0:temp=2;break;
case 1:temp=3;break;
case 2:temp=1;break;
case 3:temp=0;break;
default:printf("error
");
}
}
else{
if(temp==2) temp=3;
else if(temp==3) temp=2;
}
result+=temp*ret;
ret*=4;
}
printf("%d
",result);
T--;
}
return 0;
}
<strong>12. </strong>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#define M 5001
#define Max 1000
//#define M 500100
//#define Max 100100
int main(){
//long long phi[M];
long phi[M];
phi[1]=1;
bool prime_bool[M];
long prime[Max];
long len=0;
prime[len++]=2;
long i,j;
for(i=0;i<M;i++) prime_bool[i]=0;
for(i=4;i<M;i+=2) prime_bool[i]=1;
for(i=3;i<M;i+=2)
if(!prime_bool[i]){
prime[len++]=i;
for(j=i*i;j<M;j+=i) prime_bool[j]=1;
}
phi[1] = 1;
for (i = 2; i < M; i++) {
if (!prime_bool[i]) {
phi[i] = i - 1;
continue;
}
for (j = 0; j < len && prime[j] * prime[j] <= i; j++) {
if (i % prime[j] == 0) {
if (i / prime[j] % prime[j] == 0)
phi[i] = prime[j] * phi[i / prime[j]];
else
phi[i] = (prime[j] - 1) * phi[i / prime[j]];
break;
}
}
}
long n;
while(1){
scanf("%ld",&n);
if(n==-1) break;
//long long sum=0;
long sum=0;
for(i=1;i<=n;i++) sum+=phi[i];
sum=2*sum+1;
printf("%lld
",sum);
}
return 0;
}
<strong>13. , </strong>
#include<stdio.h>
#define Max 65538
int data[Max];
void insert(int s,int t,int step,int left,int right){
if(s==left&&t==right){
data[step]++;
return;
}
if(left==right) return;
int mid=(left+right)/2;
if(mid>=t) insert(s,t,step*2,left,mid);
else if(mid<s) insert(s,t,step*2+1,mid+1,right);
else{
insert(s,mid,step*2,left,mid);
insert(mid+1,t,step*2+1,mid+1,right);
}
}
int search(int i){
int left=0;
int right=65535;
int step=1;
int temp=data[step];
while(left<=right){
int mid=(left+right)/2;
if(i>mid){
step=step*2+1;
left=mid+1;
}
else{
step=step*2;
right=mid;
}
temp+=data[step];
if(left==right){break;}
}
return temp;
}
int main(){
int i;
for(i=0;i<Max;i++) data[i]=0;
int s,t;
for(i=0;i<3;i++){
scanf("%d%d",&s,&t);
insert(s,t,1,0,65535);
}
while(1){
int io;
scanf("%d",&io);
printf("%d
",search(io));
}
return 0;
}
<strong>14. 60=2 2 3 5</strong>
#include <stdio.h>
#include <math.h>
#define N 1000000
int arr[N];
void init()
{
int i,j;
for(i=2;i<sqrt(N);i++)
for(j=2;j<N/i;j++)
arr[i*j]=1;
}
int main()
{
long n;
int i,first;
init();
while(scanf("%ld",&n) && n)
{
for(i=2,first=1;i<=n;i++)
{
if(!arr[i])
while(!(n%i))
{
printf(first ? "%d" : "*%d",i);
n/=i;
first=0;
}
}
printf("
");
}
return 0;
}
<strong>15. </strong>
#include<stdio.h>
#include<math.h>
double cal(double x,int a,int b,int c){
return a*x*x+b*x+c;
}
double max(double a,double b){
return a>b?a:b;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int a1,b1,c1,a2,b2,c2;
scanf("%d%d%d",&a1,&b1,&c1);
scanf("%d%d%d",&a2,&b2,&c2);
double min=max(cal(0,a1,b1,c1),cal(0,a2,b2,c2));
int temp=(b1-b2)*(b1-b2)-4*(a1-a2)*(c1-c2);
bool flag=0;
double compare;
double x1;
if(temp>=0){
if((a1-a2)!=0){
x1=((b2-b1)*1.0+sqrt(temp*1.0))/(2*(a1-a2));
if(x1>0&&x1<1000) flag=1;
double x2=((b2-b1)*1.0-sqrt(temp*1.0))/(2*(a1-a2));
if(x2>0&&x2<1000){
compare=max(cal(x2,a1,b1,c1),cal(x2,a2,b2,c2));
if(compare<min) min=compare;
}
}
else if((b1-b2)!=0){
x1=(c2-c1)*1.0/(b1-b2);
if(x1>0&&x1<1000) flag=1;
}
}
if(flag){
compare=cal(x1,a1,b1,c1);
if(compare<min) min=compare;
}
compare=max(cal(1000,a1,b1,c1),cal(1000,a2,b2,c2));
if(compare<min) min=compare;
x1=(-1.0*b1)/(2*a1);
if(x1>0){
compare=max(cal(x1,a1,b1,c1),cal(x1,a2,b2,c2));
if(compare<min) min=compare;
}
x1=(-1.0*b2)/(2*a2);
if(x1>0){
compare=max(cal(x1,a1,b1,c1),cal(x1,a2,b2,c2));
if(compare<min) min=compare;
}
printf("%.4f
",min);
}
return 0;
}
<strong>16. 6=5+1</strong>
#include<stdio.h>
#include<stdlib.h>
int main(){
long f[101][101];
int n,m;
for(n=1;n<101;n++) f[n][1]=1;
for(n=1;n<101;n++)
for(m=2;m<101;m++){
if(m>n) f[n][m]=f[n][n];
else if(m==n) f[n][m]=1+f[n][m-1];
else if(n-m<m) f[n][m]=f[n-m][n-m]+f[n][m-1];
else f[n][m]=f[n-m][m]+f[n][m-1];
}
int T;
scanf("%d",&T);
while(T>0){
int n;
scanf("%d",&n);
printf("%ld
", f[n][n]);
T--;
}
return 0;
}
<strong>17. </strong>
#include<stdio.h>
int input[10]={1,2,3,4,5,6,7,8,9,10};
void perm(int n)
{
int i;
for(i=0;i<n;i++) printf("%d ",input[i]);
printf("
");
while(1)
{
// , , index
int index=-1;
for(i=n-2;i>=0;i--)
{
if(input[i]<input[i+1])
{
index=i;
break;
}
}
if(index==-1)break; // ,break while
// , input[index] input[index]
int M=0; // M (for swap)
int C; // C
for(int i=n-1;i>=index+1;i--)
{
if(input[i]>input[index])
{
C=i;
M=input[i];
break;
}
}
//cout<<index<<" "<<C<<endl;
// input[index] input[C]
input[C]=input[index];
input[index]=M;
// index , 7421, 1247,
int len=n-1-index;
for(i=1;i<=len/2;i++)
{
int t=input[index+i];
input[index+i]=input[n-i];
input[n-i]=t;
}
for(i=0;i<n;i++) printf("%d ",input[i]);
printf("
");
}
}
int main()
{
int n;
scanf("%d",&n);
perm(n);
return 0;
}
<strong>18. KMP </strong>
//KMP !
/*
* Author:puresky
* Date: 2010/12/22
* Version: KMP 4.0,
* Refer to:Handbook of Exact String-Matching Algorithms, Christian Charras & Thierry Lecroq
*/
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#define MAX_PATTERN_LEN 1024
//preprocessing for KMP
void preKMP(const char* t, int next[], int len)
{
int i,j;
next[0] = -1; //Attention: next[0] equals -1 other than 0
i = 0;
j = -1;
while(i < len)
{
while(j > -1 && t[j] != t[i])
j = next[j];
i++, j++;
if(t[j] == t[i])
next[i] = next[j];
else
next[i] = j;
}
}
// KMP, ensure strlen(t) < MAX_PATTERN_LEN
int KMP(const char* s, const char* t)
{
int next[MAX_PATTERN_LEN];
int lens = strlen(s);
int lent = strlen(t);
preKMP(t, next, lent);
int i,j;
i = j = 0;
while(i < lens)
{
while(j > -1 && t[j] != s[i])
j = next[j];
i++, j++;
if(j >= lent) return i - j;
}
return -1;
}
int main(int argc, char** argv)
{
char s[100]="aaaabaaaaaaab";
char t[15]="aaaab";
printf("S:%s
T:%s
", s, t);
int r1 = KMP(s, t); //-1 ,
printf("%d
",r1);
return 0;
}
<strong>19. aXb , </strong>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
int data[10];
int i,j;
long b=14;
char a[10001];
while(scanf("%s%ld",&a,&b)!=EOF){
for(i=0;i<10;i++) data[i]=0;
int a_length=0;
while(a[a_length++]!='\0');
char temp[2];
temp[0]=a[a_length-2];
temp[1]='\0';
long lipi=b*atoi(temp);
data[lipi%10]++;
lipi/=10;
for(i=a_length-3;i>=0;i--){
temp[0]=a[i];
temp[1]='\0';
lipi=b*atoi(temp)+lipi;
data[lipi%10]++;
lipi/=10;
}
while(lipi){
data[lipi%10]++;
lipi/=10;
}
int data_max=data[0];
for(i=1;i<10;i++){
if(data[i]>data_max){
data_max=data[i];
}
}
bool flag_first=true;
for(i=0;i<10;i++){
if(data[i]==data_max){
if(flag_first){
printf("%d",i);
flag_first=false;
}
else printf(" %d",i);
}
}
printf("
");
}
return 0;
}
<strong>20. kruskal </strong>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Max_len 100005
typedef struct node{
long adjvex;
struct node *next;
long length;
}edgenode;
typedef struct{
int num;
edgenode *link;
}vexnode;
typedef struct{
edgenode *front,*rear;
}linkqueue;
long pre_index[Max_len];
int EMPTY(linkqueue *q){
if(q->front==q->rear) return 1;
else return 0;
}
void ENQUEUEQ(linkqueue *q,long x){
q->rear->next=(edgenode*)malloc(sizeof(edgenode));
q->rear=q->rear->next;
q->rear->adjvex=x;
q->rear->next=NULL;
}
long DEQUEUEQ(linkqueue *q){
long temp;
edgenode *s;
if(EMPTY(q)) return -1;
else{
s=q->front->next;
if(s->next==NULL){
q->front->next=NULL;
q->rear=q->front;
}
else q->front->next=s->next;
temp=s->adjvex;
return temp;
}
}
void quick_sort(long x[],long l,long u){
if(l>=u) return;
long t=x[l];
long i=l;
long j=u+1;
long temp;
while(1){
do{i++;}while(i<=u&&x[i]<t);
do{j--;}while(x[j]>t);
if(i>j)break;
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
temp=x[l];
x[l]=x[j];
x[j]=temp;
quick_sort(x,l,j-1);
quick_sort(x,j+1,u);
}
struct edge{
long fromvex,endvex;
long length;
};
void quick_sort_2(edge x[],int l,int u){
if(l>=u) return;
long t=x[l].length;
int i=l;
int j=u+1;
edge temp;
while(1){
do{i++;}while(i<=u&&x[i].length<t);
do{j--;}while(x[j].length>t);
if(i>j)break;
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
temp=x[l];
x[l]=x[j];
x[j]=temp;
quick_sort_2(x,l,j-1);
quick_sort_2(x,j+1,u);
}
int main(){
int m,T;
int case_count=1;
scanf("%d",&T);
while(T--){
printf("Case #%d:
",case_count);
case_count++;
vexnode ga[Max_len];
long triangle[Max_len];
int sign[Max_len];
edge data[Max_len];
int G[Max_len];
long i,j,k,n,l,i1;
scanf("%ld",&n);
edgenode *s;
for(i=0;i<=n;i++) {ga[i].link=NULL;ga[i].num=0;}
for(i=0;i<=n;i++) {sign[i]=0;G[i]=i;}
for(i=0;i<n-1;i++){
scanf("%ld%ld%ld",&data[i].fromvex,&data[i].endvex,&data[i].length);
}
quick_sort_2(data,0,n-2);
j=0;
i=0;
while(j<n-1){
k=data[i].fromvex;
l=data[i].endvex;
sign[i]=1;
if(G[k]==G[l]) sign[i]=2;
else{
s=(edgenode*)malloc(sizeof(edgenode));
s->adjvex=data[i].endvex;
s->next=ga[data[i].fromvex].link;
s->length=data[i].length;
ga[data[i].fromvex].link=s;
ga[data[i].fromvex].num++;
s=(edgenode*)malloc(sizeof(edgenode));
s->adjvex=data[i].fromvex;
s->next=ga[data[i].endvex].link;
s->length=data[i].length;
ga[data[i].endvex].link=s;
ga[data[i].endvex].num++;
j++;
for(i1=0;i1<n;i1++)
if(G[i]==G[l]) G[i]=G[k];
}
i++;
}
scanf("%d",&m);
int j1;
for(j1=0;j1<m;j1++){
long s1,t;
scanf("%ld%ld",&s1,&t);
linkqueue *q;
q=(linkqueue*)malloc(sizeof(linkqueue));
q->front=(edgenode*)malloc(sizeof(edgenode));
q->front->next=NULL;
q->rear=q->front;
//printf("%d
",s1);
int visit[Max_len];
for(i=0;i<=n;i++) visit[i]=0;
visit[s1]=1;
ENQUEUEQ(q,s1);
int find_t=0;
for(i=0;i<=n;i++) pre_index[i]=-1;
while(!EMPTY(q)){
i=DEQUEUEQ(q);
int n_count=ga[i].num;
s=ga[i].link;
int q_count=0;
while(q_count<n_count){
if(visit[s->adjvex]!=1){
pre_index[s->adjvex]=i;
//printf("%d->%d
",i,s->adjvex);
if(s->adjvex==t){
find_t=1;
goto next_1;
}
visit[s->adjvex]=1;
ENQUEUEQ(q,s->adjvex);
}
s=s->next;
q_count++;
}
}
next_1: int find_triangle=0;
if(find_t){
long triangle_num=0;
long index=s->adjvex;
while(index!=s1){
s=ga[pre_index[index]].link;
int n_count=ga[pre_index[index]].num;
int q_count=0;
while(q_count<n_count){
if(s->adjvex==index) break;
else s=s->next;
q_count++;
}
triangle[triangle_num]=s->length;
//printf("%d
",s->length);
triangle_num++;
index=pre_index[index];
}
if(triangle_num>2){
quick_sort(triangle,0,triangle_num-1);
for(i=0;i<triangle_num;i++)
for(j=i+1;j<triangle_num;j++)
for(k=j+1;k<triangle_num;k++){
if(triangle[k]<triangle[i]+triangle[j]){find_triangle=1;break;}
}
}
}
if(find_triangle) printf("Yes
");
else printf("No
");
}
}
return 0;
}
<strong>21. </strong>
// o(nm)
#include<stdio.h>
#include <iostream>
using namespace std;
const int MAXN = 1001 ,MAXM = 1001 ;
int n1,n2,m,ans; //n1,n2 , 1..n1,1..n2 ,m
bool g[MAXN][MAXM]; // G g[x][y]
bool y[MAXM]; //Y i
int link[MAXM]; //link[y] y x
bool find(int x) // X x
{
int i;
for (i = 1 ;i <= n2;i++)
if (g[x][i] && !y[i]) // i x
{
y[i] = true ;
if (link[i] == -1 || find(link[i])) // i i
{
link[i] = x;
return true ;
}
}
return false ;
}
int main()
{
int a,b,i;
memset(g,0 ,sizeof (g));
memset(link,-1 ,sizeof (link));
ans = 0 ;
scanf("%d%d%d" ,&n1,&n2,&m);
for (i = 1 ;i <= m;i++)
{
scanf("%d%d" ,&a,&b);
g[a][b] = true ;
}
for (i = 1 ;i <= n1;i++)
{
memset(y,0 ,sizeof (y));
if (find(i))
ans++;
}
printf("%d
" ,ans);
return 0 ;
}
<strong>
22. Dijkstra </strong>
#include<stdio.h>
#define N 100
#define Max 10000 //
int D[N]; // v
int p[N],s[N];
int dist[N][N]; //
void Dijkstra(int v,int n){
int i,j,k,v1,min,max=10000;
v1=v;
for(i=0;i<n;i++){
D[i]=dist[v1][i];
if(D[i]!=Max) p[i]=v1+1;
else p[i]=0;
s[i]=0;
}
s[v1]=1;
for(i=0;i<n;i++){
min=10001;
for(j=0;j<n;j++)
if((!s[j])&&(D[j]<min)){
min=D[j];
k=j;
}
s[k]=1;
for(j=0;j<n;j++)
if((!s[j])&&(D[j]>D[k]+dist[k][j])){
D[j]=D[k]+dist[k][j];
p[j]=k+1;
}
}
int pre;
for(i=0;i<n;i++){
printf("%d %d",D[i],i);
pre=p[i];
while((pre!=0)&&(pre!=v+1)){
printf("<-%d",pre-1);
pre=p[pre-1];
}
printf("<-%d
",v);
}
}
int main(){
int data[6][6]={{0,6,9,8,10000,10000},{18,0,7,10000,10000,10},{9,10000,0,15,10000,10000},{10000,10000,12,0,10000,10000},{10000,10000,4,10000,0,10000},{24,5,10000,25,10000,0}};
int n=6,i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
dist[i][j]=data[i][j];
Dijkstra(4,n);
return 0;
}
<strong>23. SPFA </strong>
#include<iostream>
#include <vector>
#include <queue>
using namespace std;
const int SIZE = 100010;
const int INF = 0x3f3f3f3f;
int u[4*SIZE], w[4*SIZE], v[4*SIZE], next[4*SIZE]; // 4*SIZE
int first[SIZE], d[SIZE];
int sum[SIZE];
int n, m; //n ,m 。
int spfa(int src)
{
queue<int> q;
bool inq[SIZE] = {0};
for(int i = 0; i <= n; i++) d[i] = (i == src)? 0:INF;
q.push(src);
while(!q.empty())
{
int x = q.front();
q.pop();
inq[x] = 0;
for(int e = first[x]; e!=-1; e = next[e])
if(d[v[e]] > d[x]+w[e])
{
d[v[e]] = d[x]+w[e];
if(!inq[v[e]])
{
inq[v[e]] = 1;
if(++sum[v[e]] > n) //
{
return -1;
}
q.push(v[e]);
}
}
}
if(d[n] == INF) return -2;
else return d[n]; //d[i] src i ,d[n] src n
}
int main()
{
int i;
memset(first, -1, sizeof(first));
scanf("%d%d",&n,&m);
for(i = 0; i < n; i++)
{
scanf("%d%d%d", &u[i], &v[i], &w[i]);
next[i] = first[u[i]];
first[u[i]] = i;
}
int min_path=spfa(1); // , , 1 n ,0
printf("%d
",min_path);
return 0;
}
/*
1 2 7
2 3 -5
1 3 5
d[1]=0
d[2]=7
d[3]=2
*/
<strong>24. Floyd </strong>
#include<stdio.h>
#define N 101
#define Max 10000
int path[N][N];
int A[N][N];
int dist[N][N];
void Floyd(int n){
int i,j,k,next,max=10000;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if(dist[i][j]!=Max) path[i][j]=i+1;
else path[i][j]=0;
A[i][j]=dist[i][j];
}
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(A[i][j]>(A[i][k]+A[k][j])){
A[i][j]=A[i][k]+A[k][j];
path[i][j]=path[k][j];
}
for(i=0;i<n;i++)
for(j=0;j<n;j++){
printf(" %d %d",A[i][j],j);
int pre=path[i][j];
while((pre!=0)&&(pre!=i+1)){
printf("<-%d",pre-1);
pre=path[i][pre-1];
}
printf("<-%d
",i);
}
}
int main(){
int data[6][6]={{0,6,10000,8,10000,10000},{18,0,7,10000,10000,10},{9,10000,0,15,10000,10000},{10000,10000,12,0,10000,10000},{10000,10000,4,10000,0,10000},{24,5,10000,25,10000,0}};
int n=6,i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
dist[i][j]=data[i][j];
Floyd(n);
return 0;
}
<strong>25. SAP </strong>
#include<stdio.h>
#include <iostream>
#include <queue>
#define msize 1024 //
using namespace std;
int d[msize]; //
int r[msize][msize]; // ,
int num[msize]; //num[i] i
int pre[msize]; //
int n,m,s,t; //m ,n , s t
//
void ini_d() //BFS , t 0
{
int k;
queue<int>Q;
memset(d,1,sizeof(d)); // , for
memset(num,0,sizeof(num));
Q.push(t);
d[t]=0; // 0
num[0]=1;
while (!Q.empty())
{
k=Q.front(),Q.pop();
for (int i=0;i<m;i++) //
{
if (d[i]>=m&&r[i][k]>0) // , frontint
{
d[i]=d[k]+1;
Q.push(i);
num[d[i]]++;
}
}
}
}
int findAlowArc(int i) // i
{
int j;
for (j=0;j<m;j++) if (r[i][j]>0&&d[i]==d[j]+1) return j;
return -1;
}
int min(int a,int b){
return a>b?b:a;
}
int reLable(int i) //
{
int mm=INT_MAX;
for (int j=0;j<m;j++)
if (r[i][j]>0) mm=min(mm,d[j]+1);
return mm==INT_MAX?m:mm;
}
int maxFlow(int s,int t) // s
{
int flow=0,i=s,j;
int delta; //
memset(pre,-1,sizeof(pre));
while (d[s]<m)
{
j=findAlowArc(i);
if (j>=0)
{
pre[j]=i;
i=j; //
if (i==t) //
{
delta=INT_MAX;
for (i=t;i!=s;i=pre[i]) delta=min(delta,r[pre[i]][i]); //
for (i=t;i!=s;i=pre[i]) r[pre[i]][i] -= delta, r[i][pre[i]] += delta; //
flow += delta;
}
}
else
{
int x=reLable(i); //
num[x]++;
num[d[i]]--;
if (num[d[i]]==0) return flow; //
d[i]=x;
if (i!=s) i=pre[i];
}
}
return flow;
}
int main(){
int i;
m=6;
n=7;
scanf("%d%d",&m,&n);
for(i=0;i<n;i++){
int a,b,vex;
scanf("%d%d%d",&a,&b,&vex);
r[a][b]=vex; // 0
//r[a-1][b-1]=vex; // 1
}
s=0; //source node
t=5; //end node
ini_d();
printf("%d
",maxFlow(s,t));
for(i=0;i<m;i++) printf("%d->%d
",pre[i],i);
return 0;
}
<strong>26. </strong>
#include<iostream>
using namespace std;
#define Max 1000
int inf=10000;
int n, ans;
int cap[Max][Max], pre[Max];
int cost[Max][Max], dis[Max];
int que[Max];
bool vis[Max];
bool spfa(){ // 0, n。
int i, head = 0, tail = 1;
for(i = 0; i <= n; i ++){
dis[i] = inf;
vis[i] = false;
}
dis[0] = 0;// dis
que[0] = 0;
vis[0] = true; //u
while(tail != head){ // 。
int u = que[head];
for(i = 0; i <= n; i ++)
if(cap[u][i] && dis[i] > dis[u] + cost[u][i]){ // , 。
dis[i] = dis[u] + cost[u][i];
pre[i] = u;
if(!vis[i]){
vis[i] = true;
que[tail ++] = i;
if(tail == Max) tail = 0;
}
}
vis[u] = false;
head ++;
if(head == Max) head = 0;
}
if(dis[n] == inf) return false;
return true;
}
int min(int a,int b){
return a>b?b:a;
}
void end(){
int i, sum = inf;
for(i = n; i != 0; i = pre[i])
sum = min(sum, cap[pre[i]][i]);
for(i = n; i != 0; i = pre[i]){
cap[pre[i]][i] -= sum;
cap[i][pre[i]] += sum;
ans += cost[pre[i]][i] * sum; // cost[][] , 。
}
//printf("ans: %d
",ans);
}
int main(){
int m;
ans = 0;
scanf("%d%d",&n,&m);//n m
int i,u,v,ca,co;
for(i=0;i<m;i++){
scanf("%d%d%d%d",&u,&v,&ca,&co);
cap[u][v]=ca;
cost[u][v]=co;
}
n--; // 0...n-1,n-1
while(spfa()){
end(); // 0, n。
}
printf("ans: %d
",ans);
return 0;
}
<strong>27. :kruskal ,
</strong>
#include<stdio.h>
typedef struct{
int fromvex,endvex;
int length;
int sign;
}edge;
#define N 101
edge tree[N];
int G[N];
void quick_sort_2(edge x[],int l,int u){
if(l>=u) return;
int t=x[l].length;
int i=l;
int j=u+1;
edge temp;
while(1){
do{i++;}while(i<=u&&x[i].length<t);
do{j--;}while(x[j].length>t);
if(i>j)break;
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
temp=x[l];
x[l]=x[j];
x[j]=temp;
quick_sort_2(x,l,j-1);
quick_sort_2(x,j+1,u);
}
void kruskal(int n,int e){ //n ,e
int i,i1,j,k,l;
for(i=0;i<=n;i++)
G[i]=i;
for(i=0;i<e;i++){
scanf("%d %d %d",&tree[i].fromvex,&tree[i].endvex,&tree[i].length);
tree[i].sign=0;
}
quick_sort_2(tree,0,e-1);
i=0;
j=0;
while(j<n-1){
k=tree[i].fromvex;
l=tree[i].endvex;
tree[i].sign=1;
if(G[k]==G[l]) tree[i].sign=2;
else{
j++;
printf("%d
",tree[i].length);
for(i1=0;i1<n;i1++){
if(i1==l) continue;
if(G[i1]==G[l]) G[i1]=G[k];
}
G[l]=G[k];
}
i++;
}
}
int main(){
int n,e;
scanf("%d%d",&n,&e);
kruskal(n,e);
return 0;
}
<strong>28. :prime , </strong>
#include<stdio.h>
typedef struct{
int fromvex,endvex;
float length;
}edge;
#define N 100
float dist[N][N];
edge T[N-1]; // , 0~n-2,
void Prime(int i,int n){
int j,k,m,v,min,max=10000;
float d;
edge e;
v=i;
for(j=0;j<n-1;j++){
T[j].fromvex=v;
if(j>=v){T[j].endvex=j+1;T[j].length=dist[v][j+1];}
else{T[j].endvex=j;T[j].length=dist[v][j];}
}
for(k=0;k<n-1;k++){
min=max;
for(j=k;j<n-1;j++)
if(T[j].length<min){min=T[j].length;m=j;}
e=T[m];T[m]=T[k];T[k]=e;
v=T[k].endvex;
for(j=k+1;j<n-1;j++){
d=dist[v][T[j].endvex];
if(d<T[j].length){
T[j].length=d;
T[j].fromvex=v;
}
}
}
}
int main(){
float data[6][6]={{10000,10,10000,10000,19,21},{10,10000,5,7,10000,11},{10000,5,10000,6,10000,10000},{10000,7,6,10000,18,14},{19,10000,10000,18,10000,33},{21,11,10000,14,33,10000}};
int n=6,i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
dist[i][j]=data[i][j];
Prime(0,n);
for(i=0;i<n-1;i++) printf("%d->%d : %f
",T[i].fromvex,T[i].endvex,T[i].length);
return 0;
}