Codeforces 240E. Road Repairs 最小树形图+输出路径

原创 2015年07月08日 17:45:32


最小树形图裸题,不过需要记录路径

E. Road Repairs
time limit per test
2 seconds
memory limit per test
256 megabytes
input
input.txt
output
output.txt

A country named Berland has n cities. They are numbered with integers from 1 to n. City with index 1 is the capital of the country. Some pairs of cities have monodirectional roads built between them. However, not all of them are in good condition. For each road we know whether it needs repairing or not. If a road needs repairing, then it is forbidden to use it. However, the Berland government can repair the road so that it can be used.

Right now Berland is being threatened by the war with the neighbouring state. So the capital officials decided to send a military squad to each city. The squads can move only along the existing roads, as there's no time or money to build new roads. However, some roads will probably have to be repaired in order to get to some cities.

Of course the country needs much resources to defeat the enemy, so you want to be careful with what you're going to throw the forces on. That's why the Berland government wants to repair the minimum number of roads that is enough for the military troops to get to any city from the capital, driving along good or repaired roads. Your task is to help the Berland government and to find out, which roads need to be repaired.

Input

The first line contains two space-separated integers n and m (1 ≤ n, m ≤ 105) — the number of cities and the number of roads in Berland.

Next m lines contain three space-separated integers ai, bi, ci (1 ≤ ai, bi ≤ n, ai ≠ bi, 0 ≤ ci ≤ 1), describing the road from city ai to city bi. If ci equals 0, than the given road is in a good condition. If ci equals 1, then it needs to be repaired.

It is guaranteed that there is not more than one road between the cities in each direction.

Output

If even after all roads are repaired, it is still impossible to get to some city from the capital, print  - 1. Otherwise, on the first line print the minimum number of roads that need to be repaired, and on the second line print the numbers of these roads, separated by single spaces.

The roads are numbered starting from 1 in the order, in which they are given in the input.

If there are multiple sets, consisting of the minimum number of roads to repair to make travelling to any city from the capital possible, print any of them.

If it is possible to reach any city, driving along the roads that already are in a good condition, print 0 in the only output line.

Sample test(s)
input
3 2
1 3 0
3 2 1
output
1
2
input
4 4
2 3 0
3 4 0
4 1 0
4 2 1
output
-1
input
4 3
1 2 0
1 3 0
1 4 0
output
0



/* ***********************************************
Author        :CKboss
Created Time  :2015年07月07日 星期二 22时48分41秒
File Name     :CF240E.cpp
************************************************ */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=2001000;

int n,m;

struct Edge
{
	int u,v,cost,id,ru,rv,rcost;
}edge[maxn];

void add_Edge(int id,int u,int v,int c)
{
	edge[id].id=id;
	edge[id].u=edge[id].ru=u;
	edge[id].v=edge[id].rv=v;
	edge[id].cost=edge[id].rcost=c;
}

int pre[maxn],id[maxn],vis[maxn],in[maxn];

//// !!!!
int preid[maxn],useE[maxn];
int eA[maxn],eD[maxn];
int ex;

int zhuliu(int root,int n,int m,Edge edge[])
{
	int ex=m,res=0;
	while(true)
	{
		for(int i=0;i<n;i++) in[i]=INF;
		for(int i=0;i<m;i++)
		{
			if(edge[i].u!=edge[i].v&&edge[i].cost<in[edge[i].v])
			{
				pre[edge[i].v]=edge[i].u;
				in[edge[i].v]=edge[i].cost;

				//// !!!!
				preid[edge[i].v]=edge[i].id;
			}
		}
		for(int i=0;i<n;i++)
			if(i!=root&&in[i]==INF) return -1;
		int tn=0;
		memset(id,-1,sizeof(id));
		memset(vis,-1,sizeof(vis));
		in[root]=0;
		for(int i=0;i<n;i++)
		{
			res+=in[i];
			int v=i;
			//// !!!!
			if(i!=root) useE[preid[i]]++;
			while(vis[v]!=i&&id[v]==-1&&v!=root)
			{
				vis[v]=i; v=pre[v];
			}
			if(v!=root&&id[v]==-1)
			{
				for(int u=pre[v];u!=v;u=pre[u]) id[u]=tn;
				id[v]=tn++;
			}
		}
		if(tn==0) break;
		for(int i=0;i<n;i++)
			if(id[i]==-1) id[i]=tn++;
		for(int i=0;i<m;i++)
		{
			int v=edge[i].v;
			edge[i].u=id[edge[i].u];
			edge[i].v=id[edge[i].v];
			if(edge[i].u!=edge[i].v)
			{
				edge[i].cost-=in[v];
				//// !!!!
				eA[ex]=edge[i].id;
				eD[ex]=preid[v];
				edge[i].id=ex;
				ex++;
			}
		}
		n=tn;
		root=id[root];
	}

	//// !!!!
	for(int i=ex-1;i>=m;i--)
	{
		if(useE[i])
		{
			useE[eA[i]]++; useE[eD[i]]--;
		}
	}

	return res;
}

int main()
{
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
    
	scanf("%d%d",&n,&m);

	for(int i=0,a,b,c;i<m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		a--; b--;
		add_Edge(i,a,b,c);
	}

	int lens = zhuliu(0,n,m,edge);

	if(lens==0||lens==-1) { printf("%d\n",lens); return 0; }

	printf("%d\n",lens);
	for(int i=0;i<m;i++)
	{
		if(useE[i]&&edge[i].rcost)
			printf("%d ",i+1);
	}
	putchar(10);

    return 0;
}


版权声明:来自: 码代码的猿猿的AC之路 http://blog.csdn.net/ck_boss

相关文章推荐

Codeforces 240E Road Repairs(最小树形图路径)

题目链接: Codeforces 240E Road Repairs 题意: 有n个城市,编号1–n,首都编号为1,有m条有向边u[i],v[i],w[i],w[i]=0表示这条边是完好的,w[...
  • Ramay7
  • Ramay7
  • 2016年05月21日 00:03
  • 528

codeforces 721E. Road to Home

题目链接:http://codeforces.com/contest/721/problem/E 题目大意:在一条坐标范围为[0,L]的路上有n盏路灯,每盏路灯有一个照亮范围[li,ri]且没有重叠...
  • aufeas
  • aufeas
  • 2016年11月04日 21:11
  • 306

【Codeforces Round 365 (Div 2)C】【贪心 极限阻碍思想】 Chris and Road 过马路不被凸包车碰撞的最小时间

C. Chris and Road time limit per test 2 seconds memory limit per test 256 megabytes ...

CodeForces 228E The Road to Berland is Paved With Good Intentions 2Sat求解

//CodeForces 228E The Road to Berland is Paved With Good Intentions 2Sat求解 /* 题目地址: http://codeforce...

POJ 1442 Road Construction 最小路径

E - Road Construction Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S...

【Educational Codeforces Round 1E】【动态规划-多维DP】Chocolate Bar 矩形巧克力掰开吃的最小成本

E. Chocolate Bar time limit per test 2 seconds memory limit per test 256 megabytes ...

Codeforces 635D Factory Repairs【思维+树状数组】

D. Factory Repairs time limit per test 4 seconds memory limit per test 256 megabytes inpu...

Codeforces 635D Factory Repairs (树状数组)

题意有一个机器,修好的时候一天可以生产a个没修好的时候每天可以生产b个,初始时机器是坏的,修好需要k天,这k天不能生产。 给出一些操作: 1,di,ai 表示在第di天新增了ai个订单,这ai个订...

【Codeforces Round 336 (Div 2) E】【KMP 构造 脑洞 好题 模拟找规律】Marbles 两条路径同时出发前后行走能否恰好同时到终点

E. Marbles time limit per test 2 seconds memory limit per test 256 megabytes input ...

Codeforces Round #261(Div 2) E Pashmak and Graph(图中严格递增的最长路径、思维)

题目链接Codeforces Round #261(Div 2) E Pashmak and Graph题意给一个nn个点和mm条带权值的有向边的图。保证无自环和重边。在图中找到最长的一条有向路径,使...
  • Ramay7
  • Ramay7
  • 2016年09月03日 00:03
  • 286
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces 240E. Road Repairs 最小树形图+输出路径
举报原因:
原因补充:

(最多只允许输入30个字)