Exemplo n.º 1
0
int main() {
    for (; scanf("%d%d",&n,&m) != EOF;) {
        totg = n;
        tn = (n*3)/4;
        for (i = 0; i <= n; i++)  g[i].next = -1;
        for (i = 1; i <= n; i++)  addedge(0,i,-1);
        for (i = 1; i <= m; i++) {
            x = readint();
            y = readint();
            z = readint();
            if (x == 1) {
                addedge(y,z,0);
                addedge(z,y,0);
            }
            else if (x == 2)addedge(y,z,-1);
            else if (x == 3)addedge(z,y,0);
            else if (x == 4)addedge(z,y,-1);
            else addedge(y,z,0);
        }
        hasres = SPFA();
        if (hasres == 1) {
            res = 0;
            for (i = 1; i <= n; i++)res += (long long)(-d[i]);
            printf("%lld\n",res);
        }
        else printf("-1\n");
    }
}
Exemplo n.º 2
0
int main()
{
	int i,j,c,x,y,left,mid,right;
	while(EOF!=scanf("%d %d %d",&N,&M,&K))
	{
		  for(i=1;i<=N;i++)
			  first[i]=-1;
          tot=0;
          while(M--)
		  {
			  scanf("%d %d %d",&x,&y,&c);
			  add(x,y,c);
			  add(y,x,c);
		  }

		  left=0;
		  right=1000000;
		  while(left<=right)
		  {
			  mid=(left+right)/2;
			  if(SPFA(mid))
				  right=mid-1;
			  else
				  left=mid+1;
		  }
		  if(left>1000000)
			  printf("-1\n");
		  else
              printf("%d\n",left);
	}
}
Exemplo n.º 3
0
void solve()
{
	cost=0;
	while(SPFA())
		track_back();
	printf("%d\n",-cost);
}
 int solve() {
   // find a match
   for (int i=0; i<n; i+=2){
     match[i] = i+1;
     match[i+1] = i;
   }
   while (true){
     int found = 0;
     for( int i = 0 ; i < n ; i ++ )
       onstk[ i ] = dis[ i ] = 0;
     for (int i=0; i<n; i++){
       stk.clear();
       if (!onstk[i] && SPFA(i)){
         found = 1;
         while (SZ(stk)>=2){
           int u = stk.back(); stk.pop_back();
           int v = stk.back(); stk.pop_back();
           match[u] = v;
           match[v] = u;
         }
       }
     }
     if (!found) break;
   }
   int ret = 0;
   for (int i=0; i<n; i++)
     ret += edge[i][match[i]];
   ret /= 2;
   return ret;
 }
Exemplo n.º 5
0
int main()
{
  int i,k,j;
  while (scanf("%d%d",&m,&n)==2)
  {
    if (!(n || m))
      break;
    memset(e,false,sizeof(e));
    while (m--)
    {
      scanf("%d",&k);
      for (i=1;i<=k;i++)
        scanf("%d",&a[i]);
      for (i=1;i<=k;i++)
        for (j=1;j<=k;j++)
          if (i!=j)
          {
            e[a[i]][a[j]]=true;
            e[a[j]][a[i]]=true;
          }
    }
    SPFA(0);
    if (dist[n-1]>2000) puts("I can never know wywcgs!");
    else if (dist[n-1]==1) puts("I do know wywcgs!");
    else printf("I can know wywcgs by at most %d person(s)!\n",dist[n-1]-1);
  }
  return 0;
}
Exemplo n.º 6
0
// 最小费用最大流
void mincost_maxflow(int n, int source, int sink, int &flow, int &cost) {
	flow = 0, cost = 0;
	while ( SPFA(n, source, sink) ) {
		int delta = argument(n, source, sink);
		flow += delta;
		cost += sp[sink] * delta;
	}
}
Exemplo n.º 7
0
int main()
{
    scanf("%d %d",&n,&m);
    for (i = 1;i <= n;i++)//对邻接表初始化 
        no[i].next = 0;
    totn = 0; 
    for (i = 1;i <= m;i++)
    {
        scanf("%d %d %d",&f1,&f2,&l);
        getchar();//最后那个字符直接忽略掉吧,我是不知道改怎么读入了,而且我没有发现这个字母有什么实际用处。 
        getchar();//还要读入一个回车! 
        //注意,SPFA要求的是最短路,而题目是最长路,我们不妨把距离改成负数,那么不就是可以把最长路变成最短路吗?而且由于这是一个树,所以,每个点只需要遍历一次即可,所以,不需要担心负环的问题,不过,前提还是要对SPFA稍稍改动一下 
        add(f1,f2,-l);//加入f1-->f2 
        add(f2,f1,-l);//加入f2--f1
    }
    start = SPFA(1);//首先,找到树的一个端点 
    end = SPFA(start);//然后找到另一个端点 
    printf("%d\n",-dis[end]);//输出最长路的长度,由于边我们改成了负数,我们要加个负号让他变回正数。 
    return 0;
}
Exemplo n.º 8
0
 int maxFlow(){
     int cost = 0,flow = 0;
     SPFA();
     while(true){
         while(true){
             for(int i = 0;i<node;i++) use[i] = 0;
             if(!add_flow(s, INF,flow,cost)) break;
         }
         if(!modify_label()) break;
     }
     return cost;
 }
Exemplo n.º 9
0
int main()
{
	int n=0,m=0;
	int u=0,v=0,l=0;
	int i=0,j=0;
	struct node* pp=0;
	scanf("%d%d",&n,&m);
	struct shuzhu a[n+1];
	
	//初始化 邻接表 
	INITIALIZE_SOURCE(a,n);
	
	//存储输入数据到链接表中 
	for(i=0;i<m;i++)
	{
		scanf("%d%d%d",&u,&v,&l);
		pp=(struct node*)malloc(sizeof(struct node)*1);
		pp->flag=v;
		pp->wight=l;
		pp->p=a[u].p;
		a[u].p=pp;
	}
	/* 
	//检验存储代码的正确性 
	for(i=1;i<=m;i++)
	{
		printf("[%d %d]  ",a[i].d,a[i].f);
		pp=a[i].p;
		for(;pp!=NULL;)
		{
			printf("[%d %d]  ",pp->flag,pp->wight);
			pp=pp->p;
		}
		
		printf("\n");
	}
	*/ 
	
	//BELLMAN算法,计算 1号点到其他点的最短路 
	SPFA(a,n);
	
	//打印结果
	for(i=2;i<=n;i++)
	{
		printf("%d\n",a[i].d);
	}
	 
	return 0;
}
Exemplo n.º 10
0
int main(){
	int n, m;
	while( scanf("%d%d", &n, &m) != EOF ){
		int i, a, b, c;
		e = 0;
		memset(head, -1, sizeof(head));
		for( i=0; i < m; ++i )
		{// b-a <= c, ÓÐÏò±ß(a, b):c £¬±ßµÄ·½Ïò£¡£¡£¡
			scanf("%d%d%d", &a, &b, &c);
			addedge(a, b, c);
		}
		printf("%d\n", SPFA(1, n));
	}
return 0;
}
Exemplo n.º 11
0
int main(){
    read();
    Dinic();
    for(int i=1;i<=T;i++){
        for(int j=head[i];j;j=E[j].next){
            if(E[j].a>0){
                if(E[j].f) addedge(i,E[j].v,E[j].f,0);
                E[j].f=INF;
            }
            else E[j].a=0;//去掉有负环 
        }
    }
    while(SPFA());
    printf("%d",mcost);
    return 0;
}
Exemplo n.º 12
0
int main()
{
#define     debug printf("!\n")
    double x;
    while(scanf("%d%d%d%d", &N, &M, &L, &U) != EOF) {
        for(int i = 0; i < N; i++) {
            for(int j = 0; j < M; j++) {
                scanf("%lf", &x);
                edge[i][hash(j)] = log2(x/L);
                edge[hash(j)][i] = log2(U/x);
            }
        }
        printf(SPFA(M+N) ? "YES\n" : "NO\n");
        //for(int i = 0; i < M+N; i++) printf("%lf\n", dis[i]);
    }
    return 0;
}
Exemplo n.º 13
0
int MCMF(int s, int t, int n) {
  int flow = 0; // 总流量
  int i, minflow, mincost;
  mincost = 0;
  while(SPFA(s, t, n)){
    minflow = INF + 1;
    for(i = pp[t]; i != -1; i = pp[edge[i].u])
      if(edge[i].cap < minflow)
        minflow = edge[i].cap;
    flow += minflow;
    for(i = pp[t]; i != -1; i = pp[edge[i].u]){
      edge[i].cap -= minflow;
      edge[i^1].cap += minflow;
    }
    mincost += dist[t] * minflow;
  }
  sumFlow = flow; // 题目需要流量,用于判断
  return mincost;
}
 bool SPFA(int u){
   if (onstk[u]) return true;
   stk.PB(u);
   onstk[u] = 1;
   for (int v=0; v<n; v++){
     if (u != v && match[u] != v && !onstk[v]){
       int m = match[v];
       if (dis[m] > dis[u] - edge[v][m] + edge[u][v]){
         dis[m] = dis[u] - edge[v][m] + edge[u][v];
         onstk[v] = 1;
         stk.PB(v);
         if (SPFA(m)) return true;
         stk.pop_back();
         onstk[v] = 0;
       }
     }
   }
   onstk[u] = 0;
   stk.pop_back();
   return false;
 }
	PIL go(ll cb=cINF) {
		// cost_bound
		if(!SPFA()) return MP(0,0);
		pe.clear();
		int fl=INF;
		for(int v=n-1;v!=0;) {
			for(int id:e[v]) {
				int u=eg[id].to;
				const E& t=eg[id^1];
				if(t.ca>0 && MP(d[u].F+t.cost,d[u].S+1)==d[v]) {
					fl=min(fl, t.ca);
					v=u;
					pe.PB(id^1);
					break;
				}
			}
		}
		if(d[n-1].F>0) fl=min(1ll*fl, cb/d[n-1].F);
		for(int id:pe) {
			eg[id].ca-=fl;
			eg[id^1].ca+=fl;
		}
		return MP(fl, 1ll*fl*d[n-1].F);
	}
Exemplo n.º 16
0
void mincostflow() {
    maxflow = 0; mincost = 0;
    while (SPFA()) extend();
}};