ÌâÒ⣺¸øÄãÒ»ÕÅÓÐÏòͼ£¬ÎÊÊÇ·ñÄÜÕÒ³öÒ»¸öµã£¬Ê¹µÃËûµ½ËùÓеãµÄ¾àÀë×îС¡£ ˼·£º»¹ÊDz»¶¨¸ù×îСÊ÷ÐÎͼ£¬ÐéÄâÒ»¸öS×÷Ϊ¸ù£¬ÓëËùÓеãÏàÁ¬£¬È»ºóÅÜÒ»±éÖìÁõËã·¨¡£ ÖÁÓÚÕÒ³öÕâ¸öµã£¬ÎÒÃǽ«SÓëËùÓе㶼Á¬ÆðÀ´µÄʱºò£¬ÊÇ´ÓСµ½´óÁ¬µÄ¡£ËùÒÔÕâ¸ö±ßµÄ±àºÅÊÇ¿ÉÒÔ´ú±íµãµÄ±àºÅµÄ¡£ ÀýÈçn = 4 , m = 3 .ÄÇôÔÚÔÀ´3Ìõ±ßµÄ»ù´¡ÉÏ£¬µÚ4Ìõ±ß¾ÍÊÇS->0 ,ͬÀíµÚnÌõ¡£ ËùÒÔÔÚÕÒµãµÄʱºòÎÒÃÇ¿ÉÒÔÖ»¼Ç¼Õâ¸ö±ßµÄÐòºÅ£¬×îºóÊä³öµÄʱºò-m¾Í¿ÉÒÔÁË¡£ #include <set> #include <map> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <string> #include <vector> #include <iomanip> #include <cstring> #include <iostream> #include <algorithm> #define Max 2505 #define FI first #define SE second #define ll long long #define PI acos£¨-1.0£© #define inf 0x3fffffff #define LL£¨x£© £¨ x ¡¶ 1 £© #define bug puts£¨"here"£© #define PII pair<int,int> #define RR£¨x£© £¨ x ¡¶ 1 | 1 £© #define mp£¨a,b£© make_pair£¨a,b£© #define mem£¨a,b£© memset£¨a,b,sizeof£¨a£©£© #define REP£¨i,s,t£© for£¨ int i = £¨ s £© ; i <= £¨ t £© ; ++ i £© using namespace std; #define type ll inline void RD£¨int &ret£© { char c; int flag = 1 ; do { c = getchar£¨£©£» if£¨c == '-'£©flag = -1 ; } while£¨c < '0' || c > '9'£© ; ret = c - '0'; while£¨£¨c=getchar£¨£©£© >= '0' && c <= '9'£© ret = ret * 10 + £¨ c - '0' £©£» ret *= flag ; } inline void OT£¨int a£© { if£¨a >= 10£©OT£¨a / 10£© ; putchar£¨a % 10 + '0'£© ; } inline void OT£¨double a£©{ char x[111] ; sprintf£¨x , "%f" , a£© ; puts£¨x£© ; } inline void RD£¨double &ret£© { char c ; int flag = 1 ; do { c = getchar£¨£© ; if£¨c == '-'£©flag = -1 ; } while£¨c < '0' || c > '9'£© ; ll n1 = c - '0' ; while£¨£¨c = getchar£¨£©£© >= '0' && c <= '9'£© { n1 = n1 * 10 + c - '0' ; } ll n2 = 1 ; while£¨£¨c = getchar£¨£©£© >= '0' && c <= '9'£© { n1 = n1 * 10 + c - '0' ; n2 *= 10 ; } ret = flag * £¨double£©n1 / £¨double£©£¨n2£© ; } /*********************************************/ #define N 1005 #define M 10005 int n , m , S ; struct ed{ int s , e , l ; ed£¨£©{} ed£¨int _s ,int _e,int _l£©£ºs£¨_s£©£¬e£¨_e£©£¬l£¨_l£©{} }E[M] ,EE[M] ; int pre[N] , vis[N] , id[N] ; type in[N] ; int pos = -1 ; type Directed_MST£¨int root , int NV ,int NE£©{ type ret = 0 ; bool flag = 0 ; while£¨1£©{ //×îС±ß for £¨int i = 0 ; i < NV ; i ++ £©in[i] = inf ; for £¨int i = 0 ; i < NE ; i ++ £©{ int s = E[i].s ; int e = E[i].e ; if£¨s != e && in[e] > E[i].l£©{ in[e] = E[i].l ; pre[e] = s ; if£¨s == root£©{ pos = i ; } } } for £¨int i = 0 ; i < NV ; i ++ £©{ if£¨i == root£©continue ; if£¨in[i] == inf£©return -1 ; } int cntnode = 0 ; mem£¨vis , -1£© ; mem£¨id, -1£© ; in[root] = 0 ; //ÕÒ»· for £¨int i = 0 ; i < NV ; i ++ £©{ ret += in[i] ; int v = 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] = cntnode ; } id[v] = cntnode ++ ; } } if£¨cntnode == 0£©break ; //Ëõµã for £¨int i = 0 ; i < NV ; i ++ £©if£¨id[i] == -1£©id[i] = cntnode ++ ; for £¨int i = 0 ; i < NE ; i ++ £©{ int s = E[i].s ; int e = E[i].e ; E[i].s = id[s] ; E[i].e = id[e] ; if£¨id[s] != id[e]£©{ E[i].l -= in[e] ; } } NV = cntnode ; root = id[root] ; } return ret ; } int main£¨£© { int flag = 0 ; while£¨cin ¡· n ¡· m£©{ int fk = m ; pos = inf ; S = n ; for £¨int i = 0 ; i < m ; i ++ £©{ RD£¨E[i].s£© ;RD£¨E[i].e£© ; RD£¨E[i].l£© ; } for £¨int i = 0 ; i < n ; i ++ £©{ E[m].s = S ; E[m].e = i ; E[m].l = inf - 1 ; m ++ ; } type ans = Directed_MST£¨ n , n + 1 , m£© ; if£¨ans == -1 || ans - inf + 1 >= inf - 1£©puts£¨"impossible"£© ; else cout ¡¶ ans - inf + 1 ¡¶ " " ¡¶ pos - fk ¡¶ endl ; puts£¨""£© ; } return 0 ; } |